代码随想录算法训练营第三十六天 | 435. 无重叠区间、763. 划分字母区间、56. 合并区间

435. 无重叠区间

视频讲解

主要思路:

与昨天用最少箭射气球几乎一样,除了对不重叠区间要求不同

代码实现:

class Solution {
private:
    static bool cmp(vector& a, vector& b) {
        return a[0] < b[0];
    }
public:
    int eraseOverlapIntervals(vector>& 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]) continue;
            else {
                result++;
                intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);
            }
        }
        return result;
    }
};

763. 划分字母区间

视频讲解

主要思路:

利用两个循环,第一个循环遍历每个字母出现最远位置,第二个循环以第一个循环所得每个字母最远位置裁定不同区间分割线

代码实现:

class Solution {
public:
    vector partitionLabels(string s) {
        int hash[26] = {0};
        for(int i = 0; i < s.size(); i++) { //第一个循环遍历字符串s,更新每个字符最远出现位置
            hash[s[i] - 'a'] = i;
        }
        vectorresult;
        int left = 0, right = 0;
        for(int i = 0; i < s.size(); i++) { //第二个循环遍历字符串s,更新右边界,当遍历的位置与右边界重合,保存结果后更新左边界
            right = max(right, hash[s[i] - 'a']);
            if(i == right) {
                result.push_back(right - left + 1);
                left = right + 1;
            }
        }
        return result;
    }
};

56. 合并区间

视频讲解

主要思路:

将当前区间与结果集最后一个区间比较,如果重合就与结果集最后一个区间合并,否则就压入结果集

代码实现:

class Solution {
private:
    static bool cmp(vector& a, vector& b) {
        return a[0] < b[0];
    }
public:
    vector> merge(vector>& intervals) {
        sort(intervals.begin(), intervals.end(), cmp);
        vector>result;
        if(intervals.size() == 0) return result;
        result.push_back(intervals[0]);
        int i;
        for(i = 1; i < intervals.size(); i++) {
            if(result.back()[1] < intervals[i][0]) {    //为了不影响遍历原数组,将结果集最后一个元素右边界与当前区间左边界比较,如果当前区间左边界大说明不重合,把当前区间压入结果集
                result.push_back(intervals[i]);
            }
            else {  //如果重合,则把结果集最后一个元素与当前区间进行合并
                result.back()[1] = max(result.back()[1], intervals[i][1]);
            }
        }
        return result;
    }
};

你可能感兴趣的:(算法训练营,算法,leetcode)