134. 加油站
如果在笔试中遇到这道题,骗分方法是循环相加一遍,看总量是否大于等于0,若小于0可以直接return -1
。
思路
- 本题的思路在于定义了一个
int result
,当不满足继续行驶的条件时,result ++
,循环计数也开始从下个站点开始 - 同时方法二中当
volume
小于0时,即从i + 1
开始循环也很值得思考
代码随想录
135. 分发糖果
思路
- 本题涉及到一个思想,就是想处理好一边再处理另一边,不要两边想着一起兼顾
代码随想录
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> vec(ratings.size(), 1);
for (int i = 1; i < ratings.size(); i++) {
if (ratings[i] > ratings[i - 1]) vec[i] = vec[i - 1] + 1;
}
for (int i = ratings.size() - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
vec[i] = max(vec[i], vec[i + 1] + 1);
}
}
int result = 0;
for (int i = 0; i < ratings.size(); i++) {
result += vec[i];
}
return result;
}
};
860.柠檬水找零
想象超市收银台的过程
思路
- 顾客付20时,找钱时优先
“10 + 5”
,不满足条件再“5+5+5”
。
代码随想录
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
if (bills[0] != 5) {
return false;
}
int five = 0;
int ten = 0;
for (int i = 0; i < bills.size(); i++) {
if (bills[i] == 5) five ++;
else if (bills[i] == 10) {
five --;
ten ++;
if (five < 0) return false;
}else {
if (ten > 0 && five > 0) {
ten --;
five --;
}else if (five >= 3) {
five -= 3;
}else {
return false;
}
}
}
return true;
}
};
406.根据身高重建队列
本题中加深了对static bool cmp
的理解,同时也学会了list<vector<int>>
如何转成vector<vector<int>>
思路
- 先按照身高排序,若遇到相同身高的情况,则
k
值大的先排后面。 - 按照
k
值执行insert即可。
代码随想录
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) {
list<vector<int>> queue; // list底层是链表实现,插入效率比vector高的多
sort(people.begin(), people.end(), cmp);
for (int i = 0; i < people.size(); i++) {
int pos = people[i][1];
auto it = queue.begin();
while (pos --) {
it ++;
}
queue.insert(it, people[i]);
}
return vector<vector<int>>(queue.begin(), queue.end());
}
};
全程使用vector<vector<int>>
的代码:
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;
}
};