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;
}
};