134 加油站
题目链接
思路
刚拿到题的思路:局部最优:开始时出发的那站,到达下一站并准备出发时,所拥有的汽油尽可能多。找到目标站后验证正确性。测试没有通过,未通过的数据集如下:

分析问题,当前代码将4作为开始位置(因为其开始拥有汽油最多),到达第2站时无法到达。这是因为对剩余油量rest起到正作用的3没有被用到。思考得出结论:局部最优应该是净补充油量最大的子序列。换言之,我们从0开始,rest数组加和小于0,就从下一个下标位置开始。
文章详解
cpp
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
vector<int> substract(gas.size());
int total = 0;
for(int i = 0; i < substract.size();i++)
{
substract[i] = gas[i] - cost[i];
total += substract[i];
}
if(total < 0) return -1;
int start = 0;
int sum = 0;
for(int i = 0;i < substract.size();i++)
{
sum += substract[i];
if(sum < 0)
{
start = i + 1;
sum = 0;
}
}
return start;
}
};
135 分发糖果
题目链接
思路
同时考虑左右两边难以下手。将任务拆解为:
- 从第一个开始如果右边的同学rating高,右边比左边多1;
- 从最后一个开始如果左边的同学rating高,左边 = max(右边 + 1,原左边)
局部最优满足相邻的rating高,整体最优。因为每次只加1,所以也满足数量最少。
文章详解
cpp
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candy_num(ratings.size(),1);
for(int i = 0; i + 1 < ratings.size();i++)
{
if(ratings[i+1] > ratings[i])
{
candy_num[i+1] = candy_num[i] + 1;
}
}
for(int j = ratings.size()-1; j - 1 >= 0; j--)
{
if(ratings[j-1] > ratings[j] )
{
candy_num[j-1] = max(candy_num[j] + 1, candy_num[j-1]);
}
}
int ans = 0;
for(int i = 0; i < ratings.size();i++)
{
//cout << candy_num[i];
ans += candy_num[i];
}
return ans;
}
};
860 柠檬水找零
题目链接
思路
贪心的策略体现在20块的找零:先找最大的10,没了再找5,保证零钱管够
文章详解
cpp
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int n_5 = 0;
int n_10 = 0;
int n_20 = 0;
for(int i = 0; i < bills.size(); i++)
{
if(bills[i] == 5)
{
n_5++;
continue;
}
else if(bills[i] == 10)
{
n_10++;
n_5--;
}
else if(bills[i] == 20)
{
n_20++;
if(n_10) //注意贪心策略,找10前提有10
{
n_10--;
n_5--;
} else {
n_5 -= 3;
}
}
if(n_5 < 0|| n_10 < 0 || n_20 < 0) //检查合法性
{
cout << n_20 << n_10 << n_5 << endl;
return false;
}
}
return true;
}
};
406 根据身高重建队列
题目链接
思路
局部最优:左边的人比右边的人身高高,且ki比右边的人小。任务拆解一下:
- 先按身高从大往小排
- 再按其他信息调整
文章详解
cpp
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>> que;
for (int i = 0; i < people.size(); i++) {
int position = people[i][1];
que.insert(que.begin() + position, people[i]);
}
return que;
}
};