LeetCode 2395. 和相等的子数组:
题目链接:
解题思路:
把所有相邻两个数相加将他们的和存入一个数组进行排序,然后判断相邻的值是否相等即可:
const int N = 1000 * 1000 + 10; class Solution { public: bool findSubarrays(vector<int>& nums) { int n = nums.size(); int cnt = 0; int ans[N] = {0}; for (int i = 0; i + 1< n; i ++ ) ans[cnt ++ ] = nums[i] + nums[i + 1]; sort(ans, ans + cnt); for (int i = 0; i + 1 < cnt; i ++ ) if (ans[i] == ans[i + 1]) return true; return false; } };
LeetCode 2396. 严格回文的数字
题目链接:
解题思路:
将n转化为 2 到 n - 1进制数,然后对于每次转化为的进制数直接判断它是否回文即可:
const int N = 1000 * 1000 + 10; class Solution { public: bool findSubarrays(vector<int>& nums) { int n = nums.size(); int cnt = 0; int ans[N] = {0}; for (int i = 0; i + 1< n; i ++ ) ans[cnt ++ ] = nums[i] + nums[i + 1]; sort(ans, ans + cnt); for (int i = 0; i + 1 < cnt; i ++ ) if (ans[i] == ans[i + 1]) return true; return false; } };
LeetCode 2397. 被列覆盖的最多行数
题目链接:
2397. 被列覆盖的最多行数 - 力扣(LeetCode)
解题思路:
将列数转化为m位的二进制数,若第i位为1说明选择这个列,否则不选择这列:
然后枚举所有行判断改行的所有1是否在选择的列上
const int N = 15; bool st[N]; int ans; class Solution { public: int maximumRows(vector<vector<int>>& matrix, int cols) { int n = matrix.size(), m = matrix[0].size(); int res = 0; for (int i = 0; i < (1 << m); i ++ )//枚举所有选择的列的状态 { int cnt = 0; for (int j = 0; j < m; j ++ ) if (i >> j & 1) cnt ++ ;//若第j位为1说明选择第j列 if (cols != cnt) continue;//判断所选择的列数是否和题目规定的一样 int tot = 0;//选择上述枚举的列所满足条件的行数 for (int j = 0; j < n; j ++ ) { bool flag = true; for (int k = 0; k < m; k ++ ) if (matrix[j][k] && !(i >> k & 1))//若第j行第k列为1但没选择这一列说明该行 //不符合条件 { flag = false; break; } if (flag) tot ++ ;//若满足要求行数加1 } res = max(tot, res);//记录最大值 } return res; } };
LeetCode 2398. 预算内的最多机器人数目
题目链接:
2398. 预算内的最多机器人数目 - 力扣(LeetCode)
双指针算法:一个前指针 j 以及一个后指针 i 每次判断区间[j, i]的机器人是否满足要求,若不满足,则j ++ 。
这里需要一个单调队列用于存储从区间[i, j]的max(chargeTimes)
整个算法计算的是以下标 i 为结尾的可选机器人最多的数目
typedef long long LL; class Solution { public: int maximumRobots(vector<int>& x, vector<int>& y, long long m) { int n = x.size(); LL sum = 0; int res = 0; deque<int> q;//单调队列 for (int i = 0, j = 0; i < n; i ++ ) { sum += y[i]; while (q.size() && x[q.back()] <= x[i]) q.pop_back();//保证队列单调递减,即对头为 q.push_back(i); //最大值 while (q.size() && sum * (i - j + 1) + x[q.front()] > m)//若区间[i,j]中的费用大于预付 { sum -= y[j];//则j ++ ; if (q.front() == j) q.pop_front();//若对头等于j的抛出对头 j ++ ; } res = max(res, i - j + 1);//记录最大值 } return res; } };