C++での2つの重複しない間隔の最小サイズ
したがって、入力が[[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
-
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のキーを挿入しま
-
C++でのジョブスケジュールの最小難易度
タスクのリストをd日でスケジュールするとします。タスクは依存しているため、i番目のタスクで作業するには、すべてのタスクjを完了する必要があります。ここで0 <=j