【贪心算法】day7

【贪心算法】day7

📝前言说明:

  • 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话);(4)贪心策略正确性的 “证明”
  • 文章中的理解仅为个人理解。如有错误,感谢纠错
🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础python入门基础C++学习笔记Linux
🎀ZEEKLOG主页 愚润泽

你可以点击下方链接,进行其他贪心算法题目的学习

点击链接开始学习
贪心day1贪心day2
贪心day3贪心day4
贪心day5贪心day6
贪心day7贪心day8
贪心day9贪心day10

也可以点击下面连接,学习其他算法

点击链接开始学习
优选专题动态规划
递归、搜索与回溯贪心算法

题单获取【贪心算法】题单汇总

题目


55. 跳跃游戏

题目链接:https://leetcode.cn/problems/jump-game/description/

在这里插入图片描述

个人解

思路:

  • 和上一题一样

屎山代码:

classSolution{public:boolcanJump(vector<int>& nums){int n = nums.size(), left =0, right =0;int maxpos =0;while(left <= right && right < n)// 当还有 "起点"{for(int i = left; i <= right; i++) maxpos =max(maxpos, i + nums[i]); left = right +1; right = maxpos;}if(maxpos < n -1)returnfalse;returntrue;}};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)


134. 加油站

题目链接:https://leetcode.cn/problems/gas-station/description/

在这里插入图片描述

优质解

思路:

  • 题目要求:按顺序绕环路行驶一周
  • 暴力解法:枚举所有起点,从起点开始遍历一遍
  • 贪心优化:如果从点i开始出发,走了step步以后,失败了,则代表[i, i + step]区间的点都不能作为起点(因为失败一定是下一步不够油了,区间内的所有点作为起点的时候原始油为0,更不够)

代码:

classSolution{public:intcanCompleteCircuit(vector<int>& gas, vector<int>& cost){int n = gas.size();for(int i =0; i < n; i++){int step =0;int res =0;for(; step < n; step++){int nxt =(i + step)% n;// 防止越界 res = res + gas[nxt]- cost[nxt];if(res <0){ i = i + step;// 贪心优化break;}}if(res >=0)return i;}return-1;}};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)


738. 单调递增的数字

题目链接:https://leetcode.cn/problems/monotone-increasing-digits/description/

在这里插入图片描述

优质解

思路:

  • 暴力解法:从 n 开始枚举到 0,然后判断数字是否是递增的,如果是:即为得到的“最大”递增数
  • 贪心策略(对于"原数"):
    • 如果高位单调递增,则不去修改(因为我们是要找“最大数”,修改行为肯定是"该位减小",极有可能破坏递增)
    • 当发现第一个“不递增”的位置时,无法通过增大后一位来实现“递增”(因为这时候比原来的数大了),只能降低本位,然后把后面的数全填9即可
      • 但是,如果修改位置的前一个位置与本位相同,修改后会破坏递增,此时,需要递归的往前调整(即:其实是修改这些连续相同数中的“第一个”数)
  • (判断是否“递增”)技巧:
    • 转换成字符串,然后双指针
    • %10/10

屎山代码:

classSolution{public:intmonotoneIncreasingDigits(int m){ string s =to_string(m);int n = s.size();int i =0;while(i < n -1&& s[i]<= s[i +1]) i++;if(i == n -1)return m;// 特殊情况,不需要修改while(i -1>=0&& s[i -1]== s[i]) i--; s[i]--;for(int j = i +1; j < n; j++) s[j]='9';returnstoi(s);}};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

Read more

【算法】二分查找(一)朴素二分

【算法】二分查找(一)朴素二分

目录 一、题目介绍 二、朴素二分 1.原理 二段性 时间复杂度(logn) 2.模板 四、提交代码 一、题目介绍 704. 二分查找 - 力扣(LeetCode) 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果 target 存在返回下标,否则返回 -1。 你必须编写一个具有 O(log n) 时间复杂度的算法。 示例 1: 输入: nums = [-1,0,3,

By Ne0inhk
【算法文章10| 前缀和:力扣2055题:蜡烛之间的盘子】

【算法文章10| 前缀和:力扣2055题:蜡烛之间的盘子】

题目链接:2055:蜡烛之间的盘子 这道题是力扣的一道1818分的题,大概题意是这样的: * 给你一个字符串,字符串里面只有两种符号:字符 '*' 和 '|' ,其中 '*' 表示 盘子 ,'|' 表示 蜡烛 。 * 然后给你一个二维的查询数组queries,对于每一个查询 queries[i] = [lefti, righti],找到 子字符串中 在 两支蜡烛之间 的盘子的 数目 * 返回一个整数数组 answer ,其中 answer[i] 是第 i 个查询的答案。 总结一句话:找规定区间内, 在两支蜡烛之间的盘子的数目 这道题的难点在于,对于每一个查询区间[lefti, righti],怎么找区间内的离边界最近的蜡烛的位置,

By Ne0inhk
【动态规划】01背包与完全背包问题详解,LeetCode零钱兑换II秒解,轻松解力扣

【动态规划】01背包与完全背包问题详解,LeetCode零钱兑换II秒解,轻松解力扣

👨‍💻程序员三明治:个人主页 🔥 个人专栏: 《设计模式精解》《重学数据结构》 🤞先做到 再看见! 目录 * 01背包题目分析 * 01背包解决方法 * 完全背包题目分析 * 完全背包解决方法 * LeetCode 518.零钱兑换II * 思路 * 代码实现 01背包题目分析 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是O(2^n),这里的n表示物品数量。 所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化! 在下面的讲解,我举一个例子: 物品为: 重量价值物品0115物品1320物品2430 01背包解决方法 递归五部曲: 1. 确定dp数组以及下标的含义:dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,

By Ne0inhk
《算法闯关指南:优选算法--二分查找》--17.二分查找(附二分查找算法简介),18. 在排序数组中查找元素的第一个和最后一个位置

《算法闯关指南:优选算法--二分查找》--17.二分查找(附二分查找算法简介),18. 在排序数组中查找元素的第一个和最后一个位置

🔥草莓熊Lotso:个人主页 ❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受。 🎬博主简介: 目录 前言: 二分查找算法简介: 17. 二分查找 解法: 算法流程: C++算法代码: 朴素二分查找算法模板: 算法总结&&笔记展示: 18.  在排序数组中查找元素的第一个和最后一个位置 解法: C++算法代码: 算法总结&&笔记展示: 结尾: 前言: 聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”

By Ne0inhk