day 28| 134. 加油站,135. 分发糖果,860.柠檬水找零,406.根据身高重建队列

134. 加油站

134. 加油站 - 力扣(LeetCode)

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. 分发糖果

135. 分发糖果 - 力扣(LeetCode)

暴力

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.柠檬水找零

860. 柠檬水找零 - 力扣(LeetCode)

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.根据身高重建队列 

406. 根据身高重建队列 - 力扣(LeetCode)

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;
    }
};

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值