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

C++ में अनुक्रमों को सख्ती से बढ़ाने के लिए न्यूनतम स्वैप


मान लीजिए हमारे पास समान गैर-शून्य लंबाई के दो पूर्णांक अनुक्रम A और B हैं। हम तत्वों A[i] और B[i] को स्वैप कर सकते हैं। हमें ध्यान रखना होगा कि दोनों तत्व अपने संबंधित अनुक्रमों में समान सूचकांक स्थिति में हैं। कुछ संख्या में स्वैप पूरा करने के बाद, A और B दोनों सख्ती से बढ़ रहे हैं। हमें दोनों अनुक्रमों को सख्ती से बढ़ाने के लिए न्यूनतम स्वैप की संख्या ढूंढनी है।

उदाहरण के लिए, यदि इनपुट A = [1,3,5,4] और B = [1,2,3,7] जैसा है, तो उत्तर 1 होगा, यदि हम A[3] को B[3] से स्वैप करते हैं, तो अनुक्रम होंगे A = [1,3,5,7] और B = [1,2,3,4], दोनों सख्ती से बढ़ रहे हैं।

इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे:

  • n := A सरणी का आकार, आकार n के दो सरणी swapCnt और noSwapCnt बनाएं
  • swapCnt में 1 डालें और noSwapCnt में 0 डालें
  • i को 1 से n - 1 तक लूप करें
    • swapCnt[i] := n और noSwapCnt := n
    • यदि A[i] > A[i - 1] AND B[i] > B[i - 1], तो
      • noSwapCnt[i] := noSwapCnt[i - 1]
      • swapCnt[i] := swapCnt[i - 1] + 1
    • यदि A[i] > B[i - 1] and B[i] > A[i - 1], तो
      • swapCnt[i] := swapCnt[i] और 1 + noSwapCnt[i - 1] का न्यूनतम
      • noSwapCnt[i] := swapCnt[i - 1] और noSwapCnt[i] का न्यूनतम
  • swapCnt[n - 1] और noSwapCnt[n - 1] का न्यूनतम लौटाएं

उदाहरण (C++)

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:

#include <bits/stdc++.h> using namespace std; class Solution {    public:    int minSwap(vector<int>& A, vector<int>& B) {       int n = A.size();       vector <int> swapCnt(n), noSwapCnt(n);       swapCnt[0] = 1;       noSwapCnt[0] = 0;       for(int i = 1; i < n; i++){          swapCnt[i] = n;          noSwapCnt[i] = n;          if(A[i] > A[i - 1] && B[i] > B[i - 1]){             noSwapCnt[i] = noSwapCnt[i - 1];             swapCnt[i] = swapCnt[i - 1] + 1;          }          if(A[i] > B[i - 1] && B[i] > A[i - 1]){             swapCnt[i] = min(swapCnt[i], 1 + noSwapCnt[i - 1]);             noSwapCnt[i] = min(swapCnt[i - 1], noSwapCnt[i]);          }       }       return min(swapCnt[n - 1], noSwapCnt[n - 1]);    } }; main(){    vector<int> v1 = {1,3,5,4};    vector<int> v2 = {1,2,3,7};    Solution ob;    cout << (ob.minSwap(v1, v2)); }

इनपुट

[1,3,5,4] [1,2,3,7]

आउटपुट

1

  1. - C++ में कुल n बनाने के लिए आवश्यक न्यूनतम अक्षरों की संख्या

    समस्या कथन एक पूर्णांक n दिया गया है और मान लें a=1, b=2, c=3, ..., z=26। कुल n बनाने के लिए आवश्यक न्यूनतम अक्षरों की संख्या ढूंढें। यदि n=23 तो आउटपुट 1 है यदि n=72 तो आउटपुट 3 है (26 + 26 + 20) एल्गोरिदम 1. यदि n 26 से विभाज्य है तो उत्तर (n/26) है 2. यदि n 26 से विभाज्य नहीं है तो उत्तर (n/26)

  1. - C++ में स्ट्रिंग को पालिंड्रोम बनाने के लिए न्यूनतम विलोपन

    समस्या कथन आकार n की एक स्ट्रिंग दी गई है। स्ट्रिंग को पालिंड्रोम बनाने के लिए न्यूनतम वर्णों को हटाने का कार्य है। यदि दी गई स्ट्रिंग abcda है, तो हम पहले और अंतिम को छोड़कर किन्हीं 2 वर्णों को हटा सकते हैं ताकि यह पालिंड्रोम बन जाए। यदि हम b और c हटाते हैं तो ada स्ट्रिंग पालिंड्रोम है यद

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

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