C++中两个不相交区间的最小大小


假设我们有一系列区间,每个区间包含[开始时间,结束时间]。我们必须找到任意两个不相交区间的最小总大小,其中区间的尺寸为(结束时间 - 开始时间 + 1)。如果找不到这样的两个区间,则返回0。

因此,如果输入类似于[[2,5],[9,10],[4,6]],则输出将为5,因为我们可以选择大小为3的区间[4,6]和大小为2的区间[9,10]。

为了解决这个问题,我们将遵循以下步骤:

  • ret := ∞

  • n := v的大小

  • 根据结束时间对数组v进行排序

  • 定义一个大小为n的数组dp

  • for 初始化 i := 0,当 i < v的大小,更新 (i 增加 1),执行:

    • low := 0, high := i - 1

    • temp := ∞

    • val := v[i, 1] - v[i, 0] + 1

    • while low <= high,执行:

      • mid := low + (high - low) / 2

      • if v[mid, 1] >= v[i, 0],则:

        • high := mid - 1

      • 否则

        • temp := temp 和 dp[mid] 的最小值

        • low := mid + 1

    • if temp 不等于 ∞,则:

      • ret := ret 和 (temp + val) 的最小值

      • dp[i] := val 和 temp 的最小值

    • 否则

      • dp[i] := val

    • if i > 0,则

      • dp[i] := dp[i] 和 dp[i - 1] 的最小值

  • return (如果 ret 等于 ∞,则返回 0,否则返回 ret)

让我们来看下面的实现以更好地理解:

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   static bool cmp(vector <int>& a, vector <int>& b){
      return a[1] < b[1];
   }
   int solve(vector<vector<int>>& v) {
      int ret = INT_MAX;
      int n = v.size();
      sort(v.begin(), v.end(), cmp);
      vector <int> dp(n);
      for(int i = 0; i < v.size(); i++){
         int low = 0;
         int high = i - 1;
         int temp = INT_MAX;
         int val = v[i][1] - v[i][0] + 1;
         while(low <= high){
            int mid = low + (high - low) / 2;
            if(v[mid][1] >= v[i][0]){
               high = mid - 1;
            }else{
               temp = min(temp, dp[mid]);
               low = mid + 1;
            }
         }
         if(temp != INT_MAX){
            ret = min(ret, temp + val);
            dp[i] = min(val, temp);
         }else{
            dp[i] = val;
         }
            if(i > 0) dp[i] = min(dp[i], dp[i - 1]);
      }
      return ret == INT_MAX ? 0 : ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{2,5},{9,10},{4,6}};
   cout << (ob.solve(v));
}

输入

{{2,5},{9,10},{4,6}}

输出

5

更新于:2020年9月2日

213 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告