力扣算法刷题 Day 29

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;
   }
};
相关推荐
何以解忧,唯有..1 小时前
预订酒店问题
算法
No8g攻城狮1 小时前
【算法】什么是 DFS 与 BFS 及他们的区别
算法·深度优先·宽度优先
zww89491111 小时前
家政派单系统实战指南:从需求分析到智能调度算法落地
算法·需求分析
手写码匠1 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 评测实战:用 DeepSeek-R1 当裁判,打造多智能体系统的自动化质量保障体系
人工智能·深度学习·算法·aigc
ZC跨境爬虫2 小时前
LeetCode 88. 合并两个有序数组(双指针详解 + Java Python 实现)
java·python·算法·leetcode
Nil2082 小时前
leetcode 238除了自身以外数组的乘积
数据结构·算法·leetcode
土司大王2 小时前
LeetCode hot100——最长连续序列
数据结构·算法·leetcode
caimouse2 小时前
ReactOS 图形系统分析(17):区域填充 — EngPaint / IntEngPaint(paint.c)
c语言·开发语言·算法
生态学者2 小时前
Ecological Indicators | 机场鸟调的新方法:用 AWM-PC1 读懂干扰梯度下的鸟类群落
人工智能·算法·r语言·微信公众平台
Herbert_hwt2 小时前
第六章 Java深入理解接口、函数式接口与lambda表达式
java·开发语言·算法