dp
2d-array
2sum
]
Leetcode 1981. Minimize the Difference Between Target and Chosen Elements
Problem statement
https://leetcode.com/problems/minimize-the-difference-between-target-and-chosen-elements/
Solution
The idea is that our numbers are very small: mat[i][j] <= 70
, and also m, n <= 70
. It means, tha final sum of all numbers can be no more than 70**2
.
So, we can do almost bruteforce solution: iterate over rows and keep in nums
all possible sums we get so far.
Complexity
Each time we have in nums
no more than 70**2
elements and we travere it not more than 70
rows, each of which have no more than 70
elements so final complexity is O(n^4)
, where n = 70
. Then we need to find closes element to target which is just O(n^3)
. Space complexity is O(n^3)
. It was AC during contest for me, however now it gives TLE.
class Solution:
def minimizeTheDifference(self, mat, target):
nums = {0}
for row in mat:
nums = {x + i for x in row for i in nums}
return min(abs(target - x) for x in nums)
Solution 2
We can optimize solutoin, taking into account that we need to look around target
. That is if minimal sum of all numbers is more than target, we do no have choice: we need to take it. In the opposite case no need to go higher than 2*target - possible_min
Complexity
Time complexity is O(target * n^2)
now, space is O(target)
.
Code
class Solution:
def minimizeTheDifference(self, mat, target):
possible_min = sum(min(row) for row in mat)
if possible_min > target: return possible_min - target
nums = {0}
for row in mat:
nums = {x + i for x in row for i in nums if x + i <= 2*target - possible_min}
return min(abs(target - x) for x in nums)