leetcode周赛128BC题

leetcode是真做不习惯= = 不习惯的提交方式…不习惯的数据…

B题总持续时间可被 60 整除的歌曲

写完后发现数据量两个循环就可以解决,然而习惯性的以为O(n²)过不去…就写了个稍微优化了点的解法,浪费了时间_(:з」∠)_
主要就是哈希标记然后判断特殊点。硬要优化空间的话其实可以map写。。

class Solution {
public:
    int numPairsDivisibleBy60(vector<int>& time) {
        int pre[60050] = {0};//其实可用map优化一下
        int l = 0;
        int ans = 0;
        for(int i = 0; i < time.size(); i++)
        {
            pre[time[i]]++;
        }
        for(int i = 0; i < time.size(); i++)
        {
            for(int j = 60; j < 2000; j+=60)//此处主要是题目中告诉了歌曲长度不大于500,故遍历到2000去用哈希判点
            {
                if(time[i] != j-time[i] || (time[i] == j-time[i] && pre[time[i]] > 1))
                {
                	if(j-time[i] >= 0 && pre[j-time[i]] > 0)
	                {
	                    if(time[i] == j-time[i])ans += pre[time[i]]-1;
	                    else ans += pre[j-time[i]];
	                }
                }
            }
        }
        return ans/2;//因为判点时符合的重复了,例如遍历到20时加上了40,遍历到40时又重新加了一遍上次的20,故除2。
    }
};
在 D 天内送达包裹的能力

这题也是没想到遍历就可以,完全没想到数据量可以直接支持从后往前遍历,便写了个二分…
写的有点绕,因为考虑到判断符合要求时不一定是最优解。

class Solution {
public:

    int check(int mid, vector<int>& weights, int D)
    {
        int num = 1;
        int tmp = 0;
        for(int i = 0; i < weights.size(); i++)
        {
            if(weights[i] > mid)return 1;
            if(tmp+weights[i] > mid)
            {
                tmp = 0;
                num++;
                i--;
            }
            else
            {
                tmp += weights[i];
            }
        }
        if(num < D)return 0;
        else if(num==D)return 2;
        else return 1;
    }
    int shipWithinDays(vector<int>& weights, int D) {
        int l = 0;
        int r = 0x3f3f3f3f;
        int ans = r;
        while(l <= r)
        {
            int mid = (l+r)>>1;
            if(check(mid, weights, D)==2)
            {
                ans = min(ans, mid);
                r = mid-1;
            }
            else if(check(mid, weights, D)==1)
            {
                l = mid+1;
            }
            else
            {
                ans = mid;
                r = mid-1;
            }
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值