公因子的数目

代码实现
class Solution {
public:
int commonFactors(int a, int b) {
int cnt = 0;
int maxNum = min(a, b);
for (int i = 1; i <= maxNum; i++) {
if (!(a % i) && !(b % i)) cnt++;
}
return cnt;
}
};
沙漏的最大总和

代码实现(前缀和)
class Solution {
public:
int maxSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
vector<vector<long long>> dp(m, vector<long long>(n));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dp[i][j] = grid[i][j];
}
}
for (int i = 1; i < m; i++) {
dp[i][0] += dp[i - 1][0];
}
for (int j = 1; j < n; j++) {
dp[0][j] += dp[0][j - 1];
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
}
}
long long answer = 0;
for (int i = 2; i < m; i++) {
for (int j = 2; j < n; j++) {
if (i == 2 && j == 2) {
answer = max(answer, dp[i][j] - grid[i - 1][j] - grid[i - 1][j - 2]);
continue;
}
if (i == 2) {
answer = max(answer, dp[i][j] - dp[i][j - 3] - grid[i - 1][j] - grid[i - 1][j - 2]);
continue;
}
if (j == 2) {
answer = max(answer, dp[i][j] - dp[i - 3][j] - grid[i - 1][j] - grid[i - 1][j - 2]);
continue;
}
answer = max(answer, dp[i][j] - dp[i - 3][j] - dp[i][j - 3] + dp[i - 3][j - 3]
- grid[i - 1][j] - grid[i - 1][j - 2]);
}
}
return answer;
}
};
最小 XOR

代码实现
class Solution {
public:
int minimizeXor(int num1, int num2) {
int tmp1 = num1, tmp2 = num2;
int cnt1 = 0, cnt2 = 0;
while (tmp1) {
if (tmp1 & 1) cnt1++;
tmp1 = tmp1 >> 1;
}
while (tmp2) {
if (tmp2 & 1) cnt2++;
tmp2 = tmp2 >> 1;
}
int shiftLeft = 30;
int ans = 0;
while (cnt1-- && cnt2--) {
while (((1 << shiftLeft) & num1) == 0) shiftLeft--;
ans += (1 << shiftLeft);
shiftLeft--;
}
if (cnt2 < 0) return ans;
shiftLeft = 0;
while (cnt2--) {
while (((1 << shiftLeft) & num1) != 0) shiftLeft++;
ans += (1 << shiftLeft);
shiftLeft++;
}
return ans;
}
};
对字母串可执行的最大删除数

代码实现
class Solution {
private:
unordered_map<string, int> mp;
public:
int deleteString(string s) {
int i;
for (i = 0; i < s.size(); i++) {
if (s[i] != s[0]) {
break;
}
}
if (i == s.size()) return s.size();
if (s.empty()) return 0;
if (mp.count(s)) return mp[s];
int maxCnt = 1;
for (int i = 1; i <= s.size() / 2; i++) {
if (s.substr(0, i) == s.substr(i, i)) {
maxCnt = max(maxCnt, deleteString(s.substr(i)) + 1);
}
}
mp[s] = maxCnt;
return maxCnt;
}
};