【贪心算法】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

从0到1配置cursor规则Java篇:全局(Always Apply)

从0到1配置cursor规则Java篇:全局(Always Apply)

alwaysApply: true Java 项目全局规则 (Always Apply) 编码规范 命名规范 * 类名: 使用 PascalCase(大驼峰),如 UserService, OrderController * 方法名: 使用 camelCase(小驼峰),如 getUserById, processOrder * 变量名: 使用 camelCase,如 userName, orderList * 常量名: 使用 UPPER_SNAKE_CASE,如 MAX_SIZE, DEFAULT_TIMEOUT * 包名: 全小写,使用点分隔,如 com.example.project.service * 接口名: 不使用 I 前缀,

By Ne0inhk
Java中的反射机制详解:从原理到实践的全面剖析

Java中的反射机制详解:从原理到实践的全面剖析

文章目录 * 摘要 * 第一章 反射机制概述 * 1.1 什么是反射? * 1.2 反射的江湖地位:为何需要它? * 1.3 反射的优缺点 * 第二章 反射的基石:Class类与类加载 * 2.1 万物皆对象:Class对象 * 2.2 获取Class对象的三种方式 * 2.3 类加载的幕后故事 * 第三章 解剖类:反射的核心API * 3.1 操作构造方法(Constructor):创建对象 * 3.2 操作字段(Field):访问与修改属性 * 3.3 操作方法(Method):动态调用 * 第四章 深入进阶:反射的高级特性 * 4.1

By Ne0inhk
【Linux/C++多进程篇(一) 】一个变两个?揭秘 C/C++ 程序中神奇的“分身术”

【Linux/C++多进程篇(一) 】一个变两个?揭秘 C/C++ 程序中神奇的“分身术”

⭐️在这个怀疑的年代,我们依然需要信仰。 个人主页:YYYing. ⭐️Linux/C++进阶系列专栏:【从零开始的linux/c++进阶编程】 ⭐️其他专栏:【linux基础】【数据结构与算法】【从零开始的计算机网络学习】 系列上期内容:【Linux/C++文件篇(一) 】标准I/O与文件I/O基础  系列下期内容:【Linux/C++多进程篇(二) 】万字解析linux系统编程之进程间通信 (IPC) 目录 前言:        多进程理论基础 一、为什么要引入多进程 二、多进程相关概念 三、进程的内存管理 四、进程与程序的区别 五、进程的种类 六、进程PID 七、特殊的进程 八、linux中有关进程的指令 九、进程状态的切换

By Ne0inhk
【AI应用开发工程师】-分享Java 转 AI成功经验

【AI应用开发工程师】-分享Java 转 AI成功经验

Java 转 AI:别再死磕书本了,老司机带你飞! 文章目录 * Java 转 AI:别再死磕书本了,老司机带你飞! * ⭐AI 大模型应用开发全方位成长路线⭐ * 一、Java 老兵的 AI 转型焦虑:书本,你真的跟不上时代了! * 二、AI 导师,你的专属学习外挂! * 三、抱紧大腿,和 AI 大佬一起成长! * 四、拓展方案一:开源社区,你的 AI 练兵场! * 五、拓展方案二:小步快跑,项目实战是王道! * 六、拓展方案三:知识管理,告别“学了就忘”的魔咒! * 七、总结:转型 AI,一场充满乐趣的冒险!

By Ne0inhk