134. 加油站
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
int reamin = 0, lastIndex = -1;
for(int i = 0; i < n; i++){
reamin += gas[i] - cost[i];
if(reamin < 0){
lastIndex = i; // 记录后续区间油大于消耗的加油站
reamin = 0;
}
}
reamin = 0;
for(int i = lastIndex + 1; i < n; i++){
reamin += gas[i] - cost[i];
}
for(int i = 0; i <= lastIndex; i++){
reamin += gas[i] - cost[i];
}
if(reamin < 0){ // 不行
return -1;
}
return (lastIndex + 1) % n;
}
};
135. 分发糖果
暴力
class Solution {
public:
int candy(vector<int>& ratings) {
if(ratings.size() == 1){
return 1;
}
int n = ratings.size();
vector<int> lessIndex; // 记录所有“极小值”索引, “极小值”设为1
vector<int> counts(n);
for(int i = 1; i < n - 1; i++){
if(ratings[i] <= ratings[i - 1] && ratings[i] <= ratings[i + 1]){
lessIndex.push_back(i);
}
}
for(int i = 1; i < n; i++){ // 考虑初始值
if(ratings[i] >= ratings[0]){
lessIndex.push_back(0);
break;
}else if(ratings[i] < ratings[0]){
break;
}
}
for(int i = n - 2; i >= 0; i--){ // 考虑末尾
if(ratings[i] >= ratings[n - 1]){
lessIndex.push_back(n - 1);
break;
}else if(ratings[i] < ratings[n - 1]){
break;
}
}
for(int index : lessIndex){ // 遍历所有“极小值”
int left = index - 1, right = index + 1;
int curCount = 1; // 记录递增值
cout<<index<<endl;
counts[index] = 1;
while(left >= 0 && ratings[left] > ratings[index] && ratings[left] > ratings[left + 1]){
curCount++;
cout<<curCount<<endl;
counts[left] = max(counts[left], curCount);
left--;
}
curCount = 1;
while(right <= n - 1 && ratings[right] > ratings[index] && ratings[right] > ratings[right - 1]){
curCount++;
cout<<curCount<<endl;
counts[right] = max(counts[right], curCount);
right++;
}
cout<<"cef"<<endl;
}
int ans = 0;
for(int count : counts){
ans += count;
}
return ans;
}
};
860.柠檬水找零
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
unordered_map<int, int> remains = {{5, 0}, {10, 0}}; // 统计当前零钱数量
for(int i = 0; i < bills.size(); i++){
if(bills[i] == 5){
remains[5]++;
}else if(bills[i] == 10){
if(remains[5] <= 0){
return false;
}
remains[10]++;
remains[5]--;
}else if(bills[i] == 20){
if(remains[10] >= 1){
if(remains[5] == 0){
return false;
}else{
remains[5]--;
remains[10]--;
}
}else{
if(remains[5] < 3){
return false;
}else{
remains[5] -= 3;
}
}
}
}
return true;
}
};
406.根据身高重建队列
class Solution {
public:
static bool cmp(vector<int>& a, 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>> newQue;
for(int i = 0; i < people.size(); i++){
newQue.insert(newQue.begin() + people[i][1], people[i]);
}
return newQue;
}
};