Leetcode贪心专题
SL_World
中国科学院大学计算机应用技术专业在读研究生
展开
-
Leetcode|线性序列|409. 最长回文串(贪心算法)
1 贪心算法class Solution {public: int longestPalindrome(string s) { map<char, int> ch2cnt; for (auto& ch : s) ch2cnt[ch]++; int count = 0; // 是否有奇数 int isOdd = false; for (auto& m : ch2cnt) .原创 2021-03-24 15:53:13 · 379 阅读 · 0 评论 -
Leetcode|简单|区间贪心|42/53. 最大子序和(暴力+贪心+动规)
文章目录1 暴力法2 区间贪心算法1 暴力法时间复杂度:O(n2)O(n^2)O(n2)class Solution {public: int maxSubArray(vector<int>& nums) { int maxSum = INT_MIN; for (int i = 0; i < nums.size(); i++) { int sum = 0; int curSum = I原创 2021-03-18 10:26:51 · 233 阅读 · 0 评论 -
Leetcode|中等|区间贪心|763. 划分字母区间(双指针+哈希表助力合并重叠区间)
文章目录1 区间贪心(双指针未优化)2 区间贪心(双指针+哈希表助力合并重叠区间)致谢1 区间贪心(双指针未优化)一开始,很容易想到用双指针去定位两个相同字符的最远区间,然后使用重叠区间合并的思维去得到最终片段。大方向双指针思路是对的,不过没有优化,所以复杂度较高,但能ACclass Solution {public: vector<int> partitionLabels(string S) { if (S.empty()) return {};原创 2021-03-17 20:52:30 · 168 阅读 · 0 评论 -
Leetcode|中等|区间贪心|56. 合并区间
1 贪心算法一次遍历重叠则合并不重叠则添加class Solution {public: static bool cmp(const vector<int>& a, const vector<int>& b) { return a[0] < b[0]; } vector<vector<int>> merge(vector<vector<int>>& i.原创 2021-03-17 16:30:14 · 153 阅读 · 0 评论 -
Leetcode|中等|区间贪心|452. 用最少数量的箭引爆气球
1 区间终点贪心没啥好说的,和无重叠区间一样,只是依据条件,相切的那个点也算,总之很简单啦class Solution {private: static bool cmp(const vector<int>& a, const vector<int>& b) { return a[1] < b[1]; }public: int findMinArrowShots(vector<vector<int&..原创 2021-03-17 15:07:07 · 160 阅读 · 0 评论 -
Leetcode|中等|区间贪心|435. 无重叠区间
1 区间终点贪心没啥好说的,贪心算法中最简单的题,《算法设计与分析》教科书中贪心章节的第一道典例class Solution {private: static bool cmp(const vector<int>& a, const vector<int>& b) { return a[1] < b[1]; }public: int eraseOverlapIntervals(vector<vector&l.原创 2021-03-17 14:46:44 · 184 阅读 · 0 评论 -
Leetcode|中等|区间贪心|45. 跳跃游戏II
贪心算法class Solution {public: int jump(vector<int>& nums) { int size = nums.size(); // 当前覆盖终点索引 int cover = 0; int fastTarget = 0, count = 0; // 注意:i∈[0, size - 2] for (int i = 0; i < siz.原创 2021-03-17 14:17:13 · 171 阅读 · 0 评论 -
Leetcode|中等|区间贪心|55. 跳跃游戏
1 贪心算法【问题转化】:跳跃覆盖范围能否覆盖终点索引?只要覆盖到了,你愿跳几步跳几步,怎么都能跳出去,因此关键问题不在于跳几步可以恰好到终点,而是能否覆盖到终点,问题一转换,一下子就好解决了!!局部最优:每次取最大跳跃步数(取最大覆盖范围)整体最优:最后得到整体最大覆盖范围,看是否能到终点。class Solution {public: bool canJump(vector<int>& nums) { if (nums.size() == 1.原创 2021-03-17 10:32:28 · 169 阅读 · 0 评论 -
Leetcode|困难|两维度贪心|135. 分发糖果(前向贪心+后向贪心)
1 双向贪心算法贪心策略:从左到右遍历,只比较右孩子评分比左边大的情况从右到左遍历,只比较左孩子评分比右边大的情况class Solution {public: int candy(vector<int>& ratings) { int size = ratings.size(); vector<int> num(size, 1); // 1.前向贪心 for (int i = 1; i.原创 2021-03-17 00:00:01 · 324 阅读 · 0 评论 -
Leetcode|中等|两维度贪心|406. 根据身高重建队列(固定1维贪心再贪心另1维)
1 两维度贪心算法(链表版)【贪心】:先对两维度中的(第一维)身高降序排序,其中等高者,(第二维)其前方人数k少的排前面局部最优:优先将高个子的people按其前方人数k来插入,这样后面低个子往前插入时不破坏高个子属性全局最优:最后都做完插入操作,整个队列满足题目队列属性排序完的people:[[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]插入的过程:插入[7,0]:[[7,0]]插入[7,1]:[[7,0],[7,1]]插入[6,1]:[[7,0].原创 2021-03-16 21:29:42 · 121 阅读 · 0 评论 -
Leetcode|中等|股票|714. 买卖股票的最佳时机含手续费(存储最低值贪心)
1 贪心算法这是一道很不像用贪心求解的题,因为里面有最优子结构,但贪心依然可以操作,只是细节需要把控好,这是难点class Solution {public: int maxProfit(vector<int>& prices, int fee) { int money = 0; int minPrice = 0; for (int i = 0; i < prices.size(); i++) { .原创 2021-03-16 16:57:31 · 176 阅读 · 0 评论 -
Leetcode|中等|股票|122. 买卖股票的最佳时机 II
1 贪心算法class Solution {public: int maxProfit(vector<int>& prices) { int curDiff = 0; int money = 0; for (int i = 0; i < prices.size(); i++) { if (i == 0) continue; curDiff = prices[i] - pr.原创 2021-03-16 14:39:32 · 139 阅读 · 0 评论 -
Leetcode|中等|序列|738. 单调递增的数字
贪心算法【考核知识】从任意数的十位至更高位,如何读取每个数class Solution {public: int monotoneIncreasingDigits(int N) { if (N < 10) return N; int k; // 从十位开始向更高位遍历 for (k = 10; N / k > 0; k *= 10) { // 高位比低位数值大 if (.原创 2021-03-16 14:05:49 · 171 阅读 · 0 评论 -
Leetcode|中等|序列|376. 摆动序列
1 贪心算法class Solution {public: int wiggleMaxLength(vector<int>& nums) { int preDiff = 0, curDiff = 0; int count = 0; for (int i = 0; i < nums.size(); i++) { if (i == 0) { count++; .原创 2021-03-16 11:23:18 · 110 阅读 · 0 评论 -
Leetcode|简单|860. 柠檬水找零
1 贪心算法(使用undered_map)class Solution {private: unordered_map<int, int> map;public: bool lemonadeChange(vector<int>& bills) { if (bills[0] > 5) return false; for (auto& b : bills) { map[b] ++; ..原创 2021-03-16 10:00:34 · 152 阅读 · 0 评论 -
Leetcode|简单|1005. K 次取反后最大化的数组和(两次贪心)
1 两次贪心class Solution {public: int largestSumAfterKNegations(vector<int>& A, int K) { // 1.第一次贪心 sort(A.begin(), A.end()); int sum = 0; int minPos = INT_MAX; for (int i = 0; i < A.size(); i++) { .原创 2021-03-15 21:01:45 · 151 阅读 · 0 评论