LeetCode周赛304总结

一、2357.使数组中所有的元素都等于零

1、原题链接:力扣icon-default.png?t=M666https://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、原题链接:力扣icon-default.png?t=M666https://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、原题链接:力扣icon-default.png?t=M666https://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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值