C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++での2つの重複しない間隔の最小サイズ


各間隔に[開始、終了]時間が含まれる間隔のリストがあるとします。間隔のサイズが(end --start + 1)である、重複しない2つの間隔の最小合計サイズを見つける必要があります。そのような2つの間隔が見つからない場合は、0を返します。

したがって、入力が[[2,5]、[9,10]、[4,6]]の場合、間隔[4,6]を選択できるため、出力は5になります。サイズ3およびサイズ2の[9,10]。

これを解決するには、次の手順に従います-

  • ret:=inf

  • n:=vのサイズ

  • 終了時間に基づいて配列vを並べ替えます

  • サイズnの配列dpを定義します

  • 初期化i:=0の場合、i

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

    • temp:=inf

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

    • 低<=高、実行

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

      • v [mid、1]> =v [i、0]の場合、-

        • 高:=中-1

      • それ以外の場合

        • temp:=tempとdp[mid]

          の最小値
        • 低:=中+ 1

    • tempがinfと等しくない場合、-

      • ret:=retの最小値と(temp + val)

      • dp [i]:=valとtempの最小値

    • それ以外の場合

      • dp [i]:=val

    • i> 0の場合、

      • dp [i]:=dp[i]とdp[i-1]の最小値

  • return(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

  1. C++での2つの配列の共通部分

    2つの配列があるとします。それらの交差点を見つける必要があります。 したがって、入力が[1,5,3,6,9]、[2,8,9,6,7]の場合、出力は[9,6]になります。 これを解決するには、次の手順に従います- 2つのマップmp1、mp2を定義します 配列解像度を定義する nums1のxの場合 (mp1 [x]を1増やします) nums2のxの場合 (mp2 [x]を1増やします) mp1のキーと値のペアxごとに cnt:=0 cnt:=xの最小値とmp2[xのキー] 0の場合、- resの最後にxのキーを挿入しま

  2. C++でのジョブスケジュールの最小難易度

    タスクのリストをd日でスケジュールするとします。タスクは依存しているため、i番目のタスクで作業するには、すべてのタスクjを完了する必要があります。ここで0 <=j