题目链接
思路:贪心思路依然是让重叠区间尽可能安排在一起,然后统计重叠区间的数量。
class Solution {
public:
static bool cmp(const vector& a,const vector& b){
return a[0]>& intervals) {
if(intervals.size()==1) return 0;
sort(intervals.begin(),intervals.end(),cmp);
int count=0;
for(int i=1;i
错因:开始忘记排序了,注意自定义的cmp函数里传入的参数不是int型,是传入的vector。因为sort函数里面要比较的元素类型是vector型。
题目链接
思路:本题分为两步,
1、统计每一个字符最后出现的位置
2、从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
在遍历的过程中相当于是要找到每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。
class Solution {
public:
vector partitionLabels(string s) {
int hash[27]={0};
for(int i=0;i result;
int left=0,right=0;
for(int i=0;i
题目链接
思路:依然是先进行排序,将重叠区间尽可能安排在一起,然后判断重叠情况,按题目要求,重叠了应该怎么做,不重叠应该怎么做。
需要注意的是。本题没有直接在intervals(原数组)上进行操作,因为我们在合并之后要插入新的数组的同时,还需要删除合并之前的两个数组,那么原数组的大小就发生变化了,后面在for循环遍历的时候就有可能会出现死循环或者其他不可控的问题。
class Solution {
public:
static bool cmp(const vector& a,const vector& b){
return a[0]> merge(vector>& intervals) {
vector> result;
if(intervals.size()==1) return intervals;
//首先进行排序,然后才开始遍历
sort(intervals.begin(),intervals.end(),cmp);
//因为之后遍历的时候是要和上一个区间进行比较,所以先放进来一个区间,直接对result里的区间进行操作
result.push_back(intervals[0]);
for(int i=1;i