C ++中两个不重叠间隔的最小大小

假设我们有一个间隔列表,其中每个间隔都包含[开始,结束]时间。我们必须找到任何两个非重叠间隔的最小总大小,其中间隔的大小为(结束-开始+ 1)。如果找不到这两个间隔,则返回0。

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

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

  • ret:= inf

  • n:= v的大小

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

  • 定义大小为n的数组dp

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

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

    • dp [i]:= val

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

    • dp [i]:=最小温度和温度

    • 中:=低+(高-低)/ 2

    • 如果v [mid,1]> = v [i,0],则-

    • 除此以外

    • 高:=中-1

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

    • 低:=中+ 1

    • 低:= 0,高:= i-1

    • 温度:= inf

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

    • 当低<=高时,

    • 如果temp不等于inf,则-

    • 除此以外

    • 如果我> 0,那么

    • 返回(如果ret与inf相同,则为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