leetcode题目链接:435. 无重叠区间 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间_哔哩哔哩_bilibili
本题和昨天的气球题差不多,但要稍微变换一下思路。
例如:
[[1,2],[1,3],[2,3],[3,4]]
当我们按左区间排好序后,判断是否有重复,[1,2]和[1,3]有重复,那我们就可以删除区间[1,3],但此时我们要更新[1,3]的右区间,变为较小的那个,这样在下一个判断时就不会重复了。
class Solution {
public:
static bool cmp(const vector& a, const vector& b)
{
return a[0] < b[0];
}
int eraseOverlapIntervals(vector>& intervals)
{
int result = 0;
sort(intervals.begin(), intervals.end(),cmp);
for (int i = 1; i < intervals.size(); i++)
{
if (intervals[i][0] < intervals[i - 1][1])
{
result++;
intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);
}
}
return result;
}
};
leetcode题目链接:763. 划分字母区间 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:贪心算法,寻找最远的出现位置! LeetCode:763.划分字母区间_哔哩哔哩_bilibili
如图,我们首先记录每个字母出现的最远位置。
然后在遍历时,记录一个max_pos,一个start。我们从下标0开始,是'a',max_pos = 8,下标1,'b',5<8,故max_pos = 8,下标4 'c' 7<8 max_pos = 8。当i遍历到max_size后,记录区间长度max_pos - start,更新start = max_pos,继续遍历即可。
class Solution {
public:
vector partitionLabels(string s)
{
int set[26];
vectorresult;
for (int i = 0; i < s.size(); i++)
set[s[i] - 'a'] = i;
int max_pos = 0;
int start = -1;
for (int i = 0; i < s.size(); i++)
{
if (set[s[i] - 'a'] > max_pos)
max_pos = set[s[i] - 'a'];
if (i == max_pos)
{
result.push_back(max_pos - start);
start = max_pos;
}
}
return result;
}
};
leetcode题目链接:56. 合并区间 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:贪心算法,合并区间有细节!LeetCode:56.合并区间_哔哩哔哩_bilibili
有重叠就改变区间,没重叠就直接push_back
class Solution {
public:
static bool cmp(const vector& a, const vector& b)
{
return a[0] < b[0];
}
vector> merge(vector>& intervals)
{
sort(intervals.begin(), intervals.end(), cmp);
vector>result;
result.push_back(intervals[0]);
for (int i = 0; i < intervals.size(); i++)
{
if (result.back()[1] >= intervals[i][0])
result.back()[1] = max(result.back()[1], intervals[i][1]);
else
result.push_back(intervals[i]);
}
return result;
}
};