1. 程式人生 > 其它 >梳理ajax跨域常用4種解決方案(簡單易懂)

梳理ajax跨域常用4種解決方案(簡單易懂)

技術標籤:Leetcode刷圖

435. 無重疊區間

連結:https://leetcode-cn.com/problems/non-overlapping-intervals/

給定一個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。

注意:

  1. 可以認為區間的終點總是大於它的起點。
  2. 區間 [1,2] 和 [2,3] 的邊界相互“接觸”,但沒有相互重疊。

示例 1:

輸入: [ [1,2], [2,3], [3,4], [1,3] ]

輸出: 1

解釋: 移除 [1,3] 後,剩下的區間沒有重疊。

示例 2:

輸入: [ [1,2], [1,2], [1,2] ]

輸出: 2

解釋:
你需要移除兩個 [1,2] 來使剩下的區間沒有重疊。

示例 3:

輸入: [ [1,2], [2,3] ]

輸出: 0

解釋: 你不需要移除任何區間,因為它們已經是無重疊的了。

思路:我們轉換一下題目,實際上就是找到儘可能多的區間,使得他們不衝突。有刷題經驗的大夥應該知道一個經典的活動安排問題,實際上本題只是那題的一種包裝罷了。首先我們很容易想到這是一道貪心題,但是有不同的貪心策略,一般來說,我們會想到貪左端點小的,貪右端點小的,貪區間小的。

策略1:貪左端點小的

如上圖,貪區間左端點小的,但是左端點小不代表區間短,會導致兩個長度短的區間無法選擇,因此不可能是最優。

策略2:貪區間長度小的

如上圖所示,如果貪區間小的,會導致兩個不衝突的長區間無法選擇,因此不可能是最優。

策略3:貪右端點小的

我們貪右端點小的,我們假設已經選定了首區間,那麼肯定是這個區間的右端值越小,後面才越有可能加入更多的區間。

如上圖所示,3如果與1發生衝突,則必與2發生衝突,而與2衝突則不一定與1衝突,所以貪右端點小才是正確的,而其實我們並不關係左端點,因為結果與左端點的值並無關係。

class Solution {
public:
    //需要保留最多的區間 不就是安排活動問題嗎
    static bool cmp(vector<int> A,vector<int> B){
        return A[1] < B[1];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        int n = intervals.size(), i, right, ans = 1;
        if( n == 0 )return 0;
        right = intervals[0][1];
        for(i = 1; i < n; ++ i){
            if(intervals[i][0] >= right ){
                ++ ans;
                right = intervals[i][1];
            } 
        }
        return n - ans;
    }
};