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

आयत का अधिकतम योग C++ में K से बड़ा नहीं है

मान लीजिए कि हमारे पास एक 2D मैट्रिक्स है, और एक पूर्णांक k है। हमें मैट्रिक्स में एक आयत का अधिकतम योग ज्ञात करना है, जैसे कि इसका योग k से अधिक न हो। तो, अगर इनपुट इस तरह है -

1 0 1
0 -3 2

और k =3, तो आउटपुट 3 होगा, क्योंकि चिह्नित आयत का योग 3 है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • एक फ़ंक्शन को परिभाषित करें maxSumSubmatrix(), यह एक 2D सरणी मैट्रिक्स और k लेगा,
  • n :=पंक्ति संख्या, m :=स्तंभ संख्या
  • उत्तर:=-इन्फ
  • इनिशियलाइज़ l :=0 के लिए, जब l
  • एक सरणी पंक्ति परिभाषित करेंआकार n का योग
  • आर शुरू करने के लिए :=l, जब r
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • rowSum[i] :=rowSum[i] + मैट्रिक्स[i, r]
  • एक सेट को परिभाषित करें
  • s में 0 डालें
  • currSum:=0
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • currSum:=currSum + rowSum[i]
  • it :=समुच्चय का पहला अवयव जो currSum से बड़ा नहीं है - k
  • यदि यह s के अंतिम तत्व के बराबर नहीं है, तो −
    • उत्तर :=अधिकतम उत्तर और (currSum - it)
  • करसम को s में डालें
  • वापसी उत्तर
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
          int n = matrix.size();
          int m = matrix[0].size();
          int ans = INT_MIN;
          for(int l = 0; l < m; l++){
             vector <int> rowSum(n);
             for(int r = l; r < m; r++){
                for(int i = 0; i < n; i++)rowSum[i] += matrix[i][r];
                set < int > s;
                s.insert(0);
                int currSum = 0;
                for(int i = 0; i < n; i++){
                   currSum += rowSum[i];
                   set <int> :: iterator it = s.lower_bound(currSum - k);
                   if(it != s.end()){
                      ans = max(ans, (currSum - *it));
                   }
                   s.insert(currSum);
                }
             }
          }
          return ans;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{1,0,1},{0,-3,2}};
       cout << (ob.maxSumSubmatrix(v, 3));
    }

    इनपुट

    [{1,0,1},{0,-3,2}]
    3

    आउटपुट

    3

    1. C++ में वृत्त और आयत ओवरलैपिंग

      मान लीजिए कि हमारे पास एक वृत्त है जिसे (त्रिज्या, xc, yc) के रूप में दर्शाया गया है, यहाँ (xc, yc) वृत्त का केंद्र निर्देशांक है। हमारे पास एक अक्ष-संरेखित आयत भी है जिसे (x1, y1, x2, y2) के रूप में दर्शाया गया है, जहाँ (x1, y1) निचले-बाएँ कोने के निर्देशांक हैं, और (x2, y2) शीर्ष-दाएँ के निर्देशां

    1. C++ में आयत क्षेत्र II

      मान लीजिए कि हमारे पास (अक्ष-संरेखित) आयतों की एक सूची है। यहाँ प्रत्येक आयत [i] ={x1, y1, x2, y2}, जहाँ (x1, y1) निचले-बाएँ कोने का बिंदु है, और (x2, y2) ऊपरी-दाएँ कोने के बिंदु हैं आयत। हमें समतल में सभी आयतों द्वारा कवर किया गया कुल क्षेत्रफल ज्ञात करना है। उत्तर बहुत हो सकता है, इसलिए हम मॉड्यू

    1. सी ++ में एक लाइन पर मैक्स पॉइंट्स

      मान लीजिए कि हमारे पास 2D प्लेन है। हमें एक ही सीधी रेखा पर रहने वाले बिंदुओं की अधिकतम संख्या ज्ञात करनी है। तो अगर अंक इस तरह हैं - फिर 4 अंक होते हैं इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - n :=अंकों की संख्या, यदि n <3 है, तो n लौटाएं उत्तर :=2 मैं के लिए 1 से n - 1 की सीमा