我的二分
class Solution {
public:
vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
vector<vector<int>> dp(increase.size(),vector<int>(3));
vector<int> res;
dp[0][0]=increase[0][0],dp[0][1]=increase[0][1],dp[0][2]=increase[0][2];
for(int i=1;i<increase.size();i++)
for(int j=0;j<3;j++)
dp[i][j]=dp[i-1][j]+increase[i][j];
for(int i=0;i<requirements.size();i++){
int ans=-1;
if(requirements[i][0]==0&&requirements[i][1]==0&&requirements[i][2]==0) ans=0; / 需求为0的特列
else{
int left=0,right=increase.size()-1;
while(left<right){
int mid=(left+right)/2;
if(requirements[i][0]>dp[mid][0]||requirements[i][1]>dp[mid][1]||requirements[i][2]>dp[mid][2]) left=mid+1;
else right=mid; / 包含等于所以没有-1
}
if(requirements[i][0]<=dp[right][0]&&requirements[i][1]<=dp[right][1]&&requirements[i][2]<=dp[right][2])
ans=right+1; / 个数=位置+1
}
res.push_back(ans);
}
return res;
}
};
大神的二分
我写了几十分钟,大神写了两分钟(还得包括读题的时间)。
class Solution {
public:
int s[10005][3];
vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
int n=increase.size();
memset(s,0,sizeof s);
for(int i=0;i<n;++i)
{
for(int j=0;j<3;++j)
s[i+1][j]=s[i][j]+increase[i][j];
}
vector<int> g;
for(auto u:requirements)
{
int l=0,r=n+1; / 看各路大神从-1到n+1,0到n+1的,使用的如此娴熟,为什么我只能想到0到n-1
while(l<r)
{
int m=(l+r)>>1;
if(s[m][0]>=u[0]&&s[m][1]>=u[1]&&s[m][2]>=u[2])
r=m;
else l=m+1;
}
if(r>n) r=-1;
g.push_back(r);
}
return g;
}
};