class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int allsum=0;
int partsum=0;
int result=0;
for(int i=0;i<gas.size();i++){
allsum+=gas[i]-cost[i];
partsum+=gas[i]-cost[i];
if(partsum<0){
partsum=0;
result=i+1;
}
}
if(allsum<0) return -1;
return result;
}
};
随想录给的实现很简单,找到包含序列尾的尽可能长的和不为负的子序列的起始。
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int>candy(ratings.size(),1);
int result=0;
int i=1;
while(i<ratings.size()){
if(ratings[i]>ratings[i-1]) candy[i]=candy[i-1]+1;
i++;
}
i=ratings.size()-2;
while(i>=0){
if(ratings[i]>ratings[i+1]&&!(candy[i]>candy[i+1])) candy[i]=candy[i+1]+1;
i--;
}
for(i=0;i<candy.size();result+=candy[i++]);
return result;
}
};
兼顾两侧存在困难,因为一个小朋友的糖既与左侧有关又与右侧有关,即一个小朋友手里的糖与所有小朋友的评分都相关,所以不能以一次遍历同时兼顾,所以以两轮遍历分别对左右两侧进行比对。
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five=0, ten=0;
for(int i=0;i<bills.size();i++){
if(bills[i]==5){
five++;
}else{
if(bills[i]==10) ten++;
int zl=bills[i]-5;
if(zl>five*5+ten*10) return false;
if((zl/10)<=ten){
ten-=zl/10;
zl=zl%10;
}
if(zl/5>five) return false;
five-=zl/5;
}
}
return true;
}
};
这题很简单,因为只有三种面额,只有两种面额可以用于找零,只要在找零时尽可能用大面值就行。
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b){
if(a[0]==b[0]) return a[1]<b[1];
return a[0]>b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(),people.end(),cmp);
vector<vector<int>>result;
for(int i=0;i<people.size();i++){
result.insert(result.begin()+people[i][1],people[i]);
}
return result;
}
};
这题的解决方案很巧妙,在对身高进行降序排列,对编号进行升序排列后,从容器起始开始遍历,编号就是这一元素要插入到result中的索引,因为插入到result的身高比还没插入的都高。