Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में सरणी को सख्ती से बढ़ता हुआ बनाना (Make Array Strictly Increasing)


समस्या विवरण

दो सरणियाँ arr1 और arr2 दी गई हैं। हम arr1[i] = arr2[j] असाइनमेंट कर सकते हैं। arr1 को सख्ती से बढ़ता हुआ (strictly increasing) बनाने के लिए न्यूनतम ऑपरेशन्स (operations) ज्ञात करने हैं। यदि असंभव है तो -1 लौटाएं।

उदाहरण

इनपुट

arr1 = [1,5,3,7,8], arr2 = [1,3,2,5]

आउटपुट

1

व्याख्या: 5 को 2 से बदलें → [1,2,3,7,8]

समाधान दृष्टिकोण (DP + बाइनरी सर्च)

  1. arr2 को क्रमबद्ध करें और डुप्लिकेट हटाएं।
  2. DP स्थिति: dp[i][j] = सूचकांक i से शुरू करके, arr2 में सूचकांक ≥ j से मान लेकर, पिछला मान prev दिए जाने पर, न्यूनतम ऑपरेशन्स।
  3. प्रत्येक स्थिति पर दो विकल्प:
    • arr1[i] रखें (यदि prev < arr1[i])
    • arr2 से अगला वैध मान लें (upper_bound का उपयोग करके)
  4. मेमोइजेशन के साथ पुनरावर्ती हल करें।

कार्यकारी प्रोग्राम

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int solve(vector& arr1, vector& arr2, int i, int j, int prev, 
              vector>& dp) {
        if (i >= arr1.size()) return 0;
        j = upper_bound(arr2.begin() + j, arr2.end(), prev) - arr2.begin();
        if (dp[i][j] != -1) return dp[i][j];
        
        int ret = arr2.size() + 1; // अनंत
        if (prev < arr1[i]) {
            ret = min(ret, solve(arr1, arr2, i+1, j, arr1[i], dp));
        }
        if (j < arr2.size()) {
            ret = min(ret, 1 + solve(arr1, arr2, i+1, j, arr2[j], dp));
        }
        return dp[i][j] = ret;
    }
    
    int makeArrayIncreasing(vector& arr1, vector& arr2) {
        sort(arr2.begin(), arr2.end());
        arr2.erase(unique(arr2.begin(), arr2.end()), arr2.end());
        int n = arr1.size(), m = arr2.size();
        vector> dp(n+1, vector(m+1, -1));
        int ans = solve(arr1, arr2, 0, 0, INT_MIN, dp);
        return ans > m ? -1 : ans;
    }
};

int main() {
    Solution ob;
    vector v1 = {1,5,3,7,8}, v2 = {1,3,2,5};
    cout << ob.makeArrayIncreasing(v1, v2);
    return 0;
}

आउटपुट

1
  1. - C++ में को-प्राइम ऐरे बनाने के लिए न्यूनतम इंसर्शन

    इस सेक्शन में हम एक और दिलचस्प समस्या देखेंगे। मान लीजिए हमारे पास N एलिमेंट्स का एक ऐरे है। हमें इस ऐरे को को-प्राइम ऐरे बनाने के लिए न्यूनतम इंटरसेक्शन पॉइंट्स ढूंढने हैं। को-प्राइम ऐरे में हर दो लगातार एलिमेंट्स का gcd 1 होता है। हमें ऐरे भी प्रिंट करना है।मान लीजिए हमारे पास {5, 10, 20} जैसे एलि

  1. - C++ में स्ट्रिंग्स की सरणी

    इस खंड में हम देखेंगे कि C++ में स्ट्रिंग्स की सरणी को कैसे परिभाषित किया जाए। जैसा कि हम जानते हैं कि C में कोई स्ट्रिंग्स नहीं थीं। हमें कैरेक्टर सरणी का उपयोग करके स्ट्रिंग्स बनानी पड़ती थीं। इसलिए कुछ स्ट्रिंग्स की सरणी बनाने के लिए, हमें कैरेक्टर्स की 2-आयामी सरणी बनानी पड़ती थी। प्रत्येक पंक्

  1. - C++ में सॉर्टिंग

    इस सेक्शन में हम देखेंगे कि C++ में सॉर्टिंग एल्गोरिदम कैसे निष्पादित करें। एक सॉर्टेड ऐरे एक ऐरे है जिसमें प्रत्येक एलिमेंट किसी क्रम में सॉर्टेड होते हैं जैसे न्यूमेरिकल, अल्फाबेटिकल आदि। एक न्यूमेरिकल ऐरे को सॉर्ट करने के लिए कई एल्गोरिदम हैं जैसे बबल सॉर्ट, इन्सर्शन सॉर्ट, सिलेक्शन सॉर्ट, मर्ज स