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

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


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

101
0-32

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

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

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

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

उदाहरण

#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++ में वृत्त और आयत के ओवरलैप की जांच C++ में वृत्त और आयत के ओवरलैप की जांच

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

  1. C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल

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

  1. C++ में एक रेखा पर अधिकतम बिंदु C++ में एक रेखा पर अधिकतम बिंदु

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