classSolution { public: vector<vector<int>> differenceOfDistinctValues(vector<vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(); vector<vector<int>> res(m, vector<int>(n));
for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { /* top left */ unordered_set<int> cnt1, cnt2; for (int x = i - 1, y = j - 1; x >= 0 && y >= 0; x--, y--) { cnt1.emplace(grid[x][y]); } /* buttom right */ for (int x = i + 1, y = j + 1; x < m && y < n; x++, y++) { cnt2.emplace(grid[x][y]); } res[i][j] = abs(static_cast<int>(cnt1.size() - cnt2.size())); } }
return res; } };
6455. 使所有字符相等的最小成本
给你一个下标从 0 开始、长度为 n 的二进制字符串 s ,你可以对其执行两种操作:
选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 i )的所有字符,成本为 i + 1 。
选中一个下标 i 并且反转从下标 i 到下标 n - 1(包括下标 i 和下标 n - 1 )的所有字符,成本为 n - i 。
返回使字符串内所有字符 相等 需要的 最小成本 。
反转 字符意味着:如果原来的值是 ‘0’ ,则反转后值变为 ‘1’ ,反之亦然。
示例 1:
1 2 3
输入:s ="0011" 输出:2 解释:执行第二种操作,选中下标 i =2 ,可以得到 s ="0000" ,成本为 2 。可以证明 2 是使所有字符相等的最小成本。
示例 2:
1 2 3 4 5 6 7 8
输入:s ="010101" 输出:9 解释:执行第一种操作,选中下标 i =2 ,可以得到 s ="101101" ,成本为 3 。 执行第一种操作,选中下标 i =1 ,可以得到 s ="011101" ,成本为 2 。 执行第一种操作,选中下标 i =0 ,可以得到 s ="111101" ,成本为 1 。 执行第二种操作,选中下标 i =4 ,可以得到 s ="111110" ,成本为 2 。 执行第一种操作,选中下标 i =5 ,可以得到 s ="111111" ,成本为 1 。 使所有字符相等的总成本等于 9 。可以证明 9 是使所有字符相等的最小成本。
classSolution { public: longlongminimumCost(string s){ int n = s.size(); vector<vector<longlong>> dpl(n, vector<longlong>(2, INT_MAX)); vector<vector<longlong>> dpr(n, vector<longlong>(2, INT_MAX)); for (int i = 0; i < n; i++) { if (s[i] == '0') { if (i == 0) { dpl[i][0] = 0; dpl[i][1] = 1; } else { dpl[i][0] = min(dpl[i - 1][0], dpl[i - 1][1] + i); dpl[i][1] = min(dpl[i - 1][0] + i + 1, dpl[i - 1][1] + 2 * i + 1); } } else { if (i == 0) { dpl[i][0] = 1; dpl[i][1] = 0; } else { dpl[i][1] = min(dpl[i - 1][1], dpl[i - 1][0] + i); dpl[i][0] = min(dpl[i - 1][1] + i + 1, dpl[i - 1][0] + 2 * i + 1); } } } for (int i = n - 1; i >= 0; i--) { if (s[i] == '0') { if (i == n - 1) { dpr[i][0] = 0; dpr[i][1] = 1; } else { dpr[i][0] = min(dpr[i + 1][0], dpr[i + 1][1] + n - i - 1); dpr[i][1] = min(dpr[i + 1][0] + n - i, dpr[i + 1][1] + 2 * (n - i) - 1); } } else { if (i == n - 1) { dpr[i][0] = 1; dpr[i][1] = 0; } else { dpr[i][1] = min(dpr[i + 1][1], dpr[i + 1][0] + n - i - 1); dpr[i][0] = min(dpr[i + 1][1] + n - i, dpr[i + 1][0] + 2 * (n - i) - 1); } } }
longlong res = INT_MAX; for (int i = 0; i < n; i++) { if (i == 0) { res = min(dpr[i][0], dpr[i][1]); } elseif (i == n - 1) { res = min({res, dpl[i][0], dpl[i][1]}); } else { res = min(res, dpl[i][0] + dpr[i + 1][0]); res = min(res, dpl[i][1] + dpr[i + 1][1]); } } return res; } };
1 2 3 4 5 6 7 8 9 10 11
classSolution { public: longlongminimumCost(string s){ longlong ans = 0; int n = s.length(); for (int i = 1; i < n; i++) if (s[i - 1] != s[i]) ans += min(i, n - i); return ans; } };
6456. 矩阵中严格递增的单元格数
给你一个下标从 1 开始、大小为 m x n 的整数矩阵 mat,你可以选择任一单元格作为 起始单元格 。