力扣第100场双周赛补题题解

文章详细介绍了力扣第100场双周赛中的四道算法题目,包括将钱分给最多儿童的问题,最大化数组的伟大值的策略,标记元素后的数组分数计算,以及修车的最少时间的二分查找解法。每道题目的解法都涉及到了不同的算法思想,如贪心、排序和二分查找。
摘要由CSDN通过智能技术生成

将钱分给最多的儿童

class Solution {
public:
    int distMoney(int money, int children) {
        if(money < children){
            return -1;
        }
        if(money <= 8*children){
            money -= children;
            if(money % 7 == 3 && money/7 == children-1){
                return money/7-1;
            }else{
                return money/7;
            }
        }else{
            return children-1;
        }
    }
};

第一种情况:美元数小于孩子数. 返回-1.
第二种情况:美元数小于等于8孩子数, 大于等于孩子数.
先给每个孩子一美元, 然后算出剩下的美元数能分成多少份7美元,
分好之后, 最后剩下的美元不会超过6美元,
剩下的只要不是3美元, 就可以直接分配给不满8美元的孩子, 不影响结果,
如果是3美元, 但不满8美元的孩子大于等于两人, 不影响结果,
如果不满8美元的孩子只有1人, 那么只能将3美元发给正好8美元的孩子, 返回值减1.
第三种情况:美元数大于8
孩子数. 先给每个孩子8美元, 然后将多余的美元全部给到1个孩子上, 结果就是返回孩子数减1.

最大化数组的伟大值

class Solution {
public:
    int maximizeGreatness(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int pos=0;
        int ans=0;
        for(int i=0;i<n;++i){
            while(pos < n && nums[pos] <= nums[i])
            {
                ++pos;
            }
            if(pos == n){
                ans = i;
                break;
            }
            ++pos;
        }
        return ans;
    }
};

双指针.
将数组从小到大排好序后, 设指针i和指针pos, 指针i从0到n-1, 对每次指针i所指元素, 指针pos都循环自增找到一个恰好比指针i所指元素大的元素, 直到指针pos等于n结束

标记所有元素后数组的分数

class Solution {
public:
    long long findScore(vector<int>& nums) {
        int n = nums.size();
        vector<pair<int, int>> tnums(n);
        for(int i=0;i<n;++i){
            tnums[i] = make_pair(nums[i], i);
        }
        sort(tnums.begin(), tnums.end(), [](pair<int, int> a, pair<int, int> b){
            if(a.first != b.first){
                return a.first < b.first;
            }
            return a.second < b.second;
        });
        map<int, bool> vis;
        long long ret = 0;
        for(int i=0;i<n;++i){
            int num = tnums[i].first, pos = tnums[i].second;
            if(!vis[pos]){
                ret += num;
                vis[pos] = 1;
                if(pos == 0){
                    vis[1] = 1;
                }else if(pos == n-1){
                    vis[n-2] = 1;
                }else{
                    vis[pos-1] = 1, vis[pos+1] = 1;
                }
            }
        }
        return ret;
    }
};

模拟.
将nums的值与下标组合放入新数组tnums, 按照值从小到大, 下标从小到大排序
写个map记录被选择的下标
遍历tnums, 然后当前元素的下标没有被选择过, 就将值加入到ret(score), 然后将当前下标和两边都打上标记.
返回ret.

修车的最少时间

class Solution {
public:
    bool check(long long mid, int cars, vector<int>& ranks)
    {
        int n = ranks.size();
        long long sum = 0;
        for(int i=0;i<n;++i){
            sum += (int)sqrt(1.0*mid/ranks[i]);
        }
        return sum >= cars;
    }
    long long repairCars(vector<int>& ranks, int cars) {
        long long l = 0, r = 1e14;
        while(l <= r)
        {
            long long mid = (l+r)/2;
            if(check(mid, cars, ranks)){
                r = mid-1;
            }else{
                l = mid+1;
            }
        }
        return l;
    }
};

二分.
二分修车的最少时间, 每次二分检查在当前时间下每名机械功最多修好车数之和.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y_cen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值