加油站
抽象,想到了一些,但是思路并没有缕清楚。
class Solution {
public:
int canCompleteCircuit(vector& gas, vector & cost) {
int rest;
for (int i = 0; i < cost.size(); i++) {
rest = gas[i] - cost[i];
int index = (i + 1) % cost.size();
while (index != i && rest > 0) {
rest += gas[index] - cost[index];
index = (index + 1) % cost.size();
}
if (index == i && rest >= 0) {
return i;
}
}
return -1;
}
};
分发糖果
题目描述
给一队小朋友发糖,相邻小朋友友分高的必须糖多。
基底:每个都有一颗糖。
class Solution {
public:
int candy(vector<int>& ratings) {
//int count=0;
vector<int> CandyVect(ratings.size(),1);
for(int i=1;i<ratings.size();i++) {
if(ratings[i]>ratings[i-1])
CandyVect[i]=CandyVect[i-1]+1;
}
for(int i=ratings.size()-2;i>=0;i--) {
if(ratings[i]>ratings[i+1])
CandyVect[i]=max(CandyVect[i],CandyVect[i+1]+1);//
}
int sum=0;
for(int i=0;i<CandyVect.size();i++) {sum+=CandyVect[i];}
return sum;
}
};
问题
为什么要从两边看呢?
如果ratings{1,2,3,3,?} 那么candy必须是{1,2,3,?}
如果ratings{1,2,3,2,1} 那么candy必须是{1,2,3,2,1}
在基底之上,不能通过判断i和i+1确定i+1的candy数,需要考虑i+1 后面的ratings值。
卖lemon water
问题理解
一开始试图找路径,看题解发现竟然可以就用当下情况分类,并记录过去状态解决。其实在分析过程中也是使用了这种策略,这个思路其实是很自然的。
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++;
// return true;
}
if (bills[i] == 10) {
if (five == 0) {
return false;
} else {
five--;
ten++;
}
}
if (bills[i] == 20) {
if (ten > 0 && five > 0) {
ten--;
five--;
} else if (five >= 3) {
five -= 3;
} else
return false;
}
}
return true;
}
};
根据身高重建队列
问题理解
class Solution {
static bool cmd(const vector<int>& a,const vector<int>& b){
if(a[0]==b[0]) return a[1]<b[1];
return a[0]>b[0];
}
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
vector<vector<int>> queue;
sort(people.begin(),people.end(),cmd);
for(int i=0;i<people.size();i++){
int position=people[i][1];
queue.insert(queue.begin()+position,people[i]);
}
return queue;
}
};
不应该一开始看测试用例的输出,从输入开始想办法才对。确实是根据身高重建序列。
浙公网安备 33010602011771号