classSolution { public: intminimizeTheDifference(vector<vector<int>>& mat, int target){ // 1 * m ~ 70 * m = 4900 // 4900 * n * m = 24,010,000 constint MAXNUMBER = 70; constint m = mat.size(); vector<bool> dp(MAXNUMBER * m + 1, false); dp[0] = true; for (int i = 0; i < m; ++i) { vector<bool> newdp(MAXNUMBER * m + 1, false); for (int j = MAXNUMBER * m; j >= 0; --j) { if (dp[j]) { for (int k : mat[i]) { if (j + k <= MAXNUMBER * m) newdp[j + k] = true; } } } dp = move(newdp); } int i; for (i = 0; target + i <= MAXNUMBER * m || target - i >= 0; ++i) { if ((target + i <= MAXNUMBER * m && dp[target + i]) || (target - i >= 0 && target - i <= MAXNUMBER * m && dp[target - i])) return i; } return i; } };
时间复杂度: O(m * max(mat[i][j]) * m * n) = 24,010,000,
空间复杂度: O(max(mat[i][j]) * m).
WA 一次:因为每行必须选一个数,不能不选。因此dp需要新开一个数组,不能复用原来的。
Runtime Error 一次:target有可能大于MAXNUMBER * m,因此必须加判断。