मान लीजिए कि हमारे पास अंतराल की एक सूची है जहां प्रत्येक अंतराल में [प्रारंभ, समाप्ति] समय होता है। हमें किन्हीं दो गैर-अतिव्यापी अंतरालों का न्यूनतम कुल आकार ज्ञात करना है, जहाँ एक अंतराल का आकार (अंत - प्रारंभ + 1) है। अगर हमें ऐसे दो अंतराल नहीं मिलते हैं, तो 0 पर लौटें।
इसलिए, यदि इनपुट [[2,5],[9,10],[4,6]] जैसा है, तो आउटपुट 5 होगा क्योंकि हम अंतराल [4,6] चुन सकते हैं। आकार 3 और [9,10] आकार 2 का।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
रिट :=inf
-
n:=वी का आकार
-
समाप्ति समय के आधार पर सरणी v को क्रमबद्ध करें
-
n आकार की dp सरणी परिभाषित करें
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
निम्न :=0, उच्च :=i - 1
-
अस्थायी:=inf
-
वैल :=v[i, 1] - v[i, 0] + 1
-
जबकि कम <=उच्च, करें
-
मध्य:=निम्न + (उच्च-निम्न)/2
-
अगर v[मध्य, 1]>=v[i, 0], तो -
-
उच्च :=मध्य - 1
-
-
अन्यथा
-
अस्थायी:=न्यूनतम तापमान और डीपी [मध्य]
-
कम :=मध्य + 1
-
-
-
अगर अस्थायी inf के बराबर नहीं है, तो -
-
रिट :=न्यूनतम रिट और (अस्थायी + वैल)
-
dp[i] :=न्यूनतम वैल और टेम्परेचर
-
-
अन्यथा
-
डीपी [i] :=वैल
-
-
अगर मैं> 0, तो
-
dp[i] :=न्यूनतम dp[i] और dp[i - 1]
-
-
-
वापसी (यदि रिट inf के समान है, तो 0, अन्यथा रिट)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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