134.加油站
要点:局部最优推全局最优。rest = gas - cost,当天的总rest,是前面每一天rest的累加,如果当天总rest小于0,说明从起点到当天的这个区间内,无论从哪一天开始,都是开不到终点的,只有当天的下一天才有可能到终点。totalSum用于判断是不是真的能到终点。
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0;
int totalSum = 0;
int start = 0;
for (int i = 0; i < gas.size(); i++) {
curSum += (gas[i] - cost[i]);
totalSum += (gas[i] - cost[i]);
if (curSum < 0) {
start = i + 1;
curSum = 0;
}
}
if (totalSum < 0)
return -1;
return start;
}
};
135.分发糖果
要点:太难想到了,但是总结起来很简单。结果数组全部初始化为1;从左往右遍历,比较当前元素和左边元素的大小,如果大,就在左边元素结果的基础上+1;从右往左遍历,比较当前元素和右边元素的大小,就在右边元素结果的基础上+1;两次遍历,每个位置都取最大值,得到的就是最终的结果数组。
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candyVec(ratings.size(), 1);
for (int i = 1; i < ratings.size(); i++) {
if (ratings[i] > ratings[i - 1]) {
candyVec[i] = candyVec[i - 1] + 1;
}
}
for (int i = ratings.size() - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);
}
}
int result = 0;
for (int i : candyVec) result+= i;
return result;
}
};
860.柠檬水找零
要点:确实是一道简单题。账单里只有5 10 20 三个数,也就是只有三种情况;账单=5,不用找零;账单=10,要找一个5;账单=20,要找一个10一个5或者找三个5;把三种情况梳理清楚,遍历处理每个账单,把手里 5 10 的纸币数量记录清楚就可以解题了。
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five = 0, ten = 0, twenty = 0;
for (int i = 0; i < bills.size(); i++) {
if (bills[i] == 5) {
five++;
} else if (bills[i] == 10) {
if (five > 0) {
five--;
ten++;
} else {
return false;
}
} else {
if (five > 0 && ten > 0) {
five--;
ten--;
} else if (five >= 3) {
five -= 3;
} else {
return false;
}
}
}
return true;
}
};
406.根据身高重建队列
要点:真的难想。先按身高h从大到小排序,如果h相等,按k从小到大排序;排完序后开始遍历,k值其实就是该元素在队列中应该待的位置,有点难描述,画图排一下序就能想明白。(频繁插入,用链表更快)
class Solution {
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];
}
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);
list<vector<int>> que;
for (int i = 0; i < people.size(); i++) {
int position = people[i][1];
std::list<vector<int>>::iterator it = que.begin();
while (position--) {
it++;
}
que.insert(it, people[i]);
}
return vector<vector<int>>(que.begin(), que.end());
}
};