一、2357.使数组中所有的元素都等于零
1、原题链接:力扣https://leetcode.cn/problems/make-array-zero-by-subtracting-equal-amounts/
2、解题思路:
总体思路就是暴力干,先预处理删除数组中的零,然后逆序排序数组且去重,然后每次删除数组中最小的元素,若数组中的元素为零则删除这个元素直到数组的元素个数为零。结果就是删除元素的次数。
3、参考代码:
class Solution {
public:
int minimumOperations(vector<int>& nums) {
int res = 0;
vector<int> tmp;
for(int i = 0; i < nums.size(); i ++) if(nums[i]) tmp.push_back(nums[i]);
if(tmp.size() == 0) return res;
sort(tmp.rbegin(), tmp.rend());
tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
while(tmp.size()) {
for(auto& c : tmp) {
c -= tmp.back();
}
if(tmp.back() == 0) tmp.pop_back();
res ++;
}
return res;
}
};
二、2358.分组的最大数量
1、原题链接:力扣https://leetcode.cn/problems/maximum-number-of-groups-entering-a-competition/
2、解题思路:
总的思想就是,我们对数组进行排序后总会找到(k+1)个数的和大于k个数的和,所以我们不需要去关心数的大小,只需要关心数的个数即可。
3、参考代码:
class Solution {
public:
int maximumGroups(vector<int>& grades) {
int k = 1;
int n = grades.size();
while((k + 2)*(k + 1)/2 <= n) k ++;
return k;
}
};
三、2359.找到离给定两个节点最近的节点
1、原题链接:力扣https://leetcode.cn/problems/find-closest-node-to-given-two-nodes/
2、解题思路:
第一步,遍历每个点,保存node1和node2到每个点的距离;
第二步,遍历找到node1和node2都能到达的节点,然后更新保存的两个距离中的较大值,并同时更新当前保存的节点编号。
3、参考代码:
class Solution {
public:
int closestMeetingNode(vector<int>& edges, int node1, int node2) {
int n = edges.size();
vector<int> d1(n, -1), d2(n, -1);
d1[node1] = d2[node2] = 0;
while(edges[node1] != -1) {
if(d1[edges[node1]] != -1) break;
d1[edges[node1]] = d1[node1] + 1;
node1 = edges[node1];
}
while(edges[node2] != -1) {
if(d2[edges[node2]] != -1) break;
d2[edges[node2]] = d2[node2] + 1;
node2 = edges[node2];
}
int res = -1, id = -1;
for(int i = 0; i < n; i ++ ) {
int a = d1[i], b = d2[i];
if(a != -1 && b != -1)
if(res == -1 || res > max(a, b)) {
res = max(a, b);
id = i;
}
}
return id;
}
};