【代码随想录算法训练营——Day28】贪心算法——452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间
LeetCode题目链接
https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/
https://leetcode.cn/problems/non-overlapping-intervals/
https://leetcode.cn/problems/partition-labels/description/
题解
452.用最少数量的箭引爆气球
题解和代码都看得迷迷糊糊。
chatGPT解读了一下印象加深了。
435.无重叠区间
上一题没看懂,仿照上一题的代码写看行不行。
写了一下,没写对。
题解用了一个很巧妙的思想,记录非交叉区间的个数,总数减去这个数即为重叠区间数。题解是用右边界排序,我按左边界排序试一下。
等一下,我先前写的代码改了一句就通过了,就是intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);
这一句。
763.划分字母区间
题解的一个重要思想是要求字符出现的最大次数的位置,是这一组字符里面出现距离最远的字符,的位置为这段字符串的结束位置。
代码
//452.用最少数量的箭引爆气球
//435.无重叠区间
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;class Solution {
private: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];}
public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(), cmp);int result = 0;for (int i = 1;i < intervals.size();i++) {if (intervals[i][0] < intervals[i - 1][1]) {result += 1;intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);}}return result;}
};//class Solution {
//public:
// // 按照区间右边界排序
// static bool cmp(const vector<int>& a, const vector<int>& b) {
// return a[0] < b[0];
// }
// int eraseOverlapIntervals(vector<vector<int>>& intervals) {
// if (intervals.size() == 0) return 0;
// sort(intervals.begin(), intervals.end(), cmp);
// int count = 1; // 记录非交叉区间的个数
// int end = intervals[0][1]; // 记录区间分割点
// for (int i = 1; i < intervals.size(); i++) {
// if (end <= intervals[i][0]) {
// end = intervals[i][1];
// count++;
// }
// else {
// end = min(end, intervals[i][1]);
// }
// }
// return intervals.size() - count;
// }
//};int main() {vector<vector<int>> nums1 = { {1,2} ,{2,3},{3,4},{1,3} }, nums2 = { {1,2} ,{1,2},{1,2} }, nums3 = { {1,2} ,{2,3} }, nums4 = { {1,100} ,{11,22},{1,11},{2,12} };Solution s;printf("%d", s.eraseOverlapIntervals(nums2));return 0;
}
//763.划分字母区间