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

C++ में 2D रेंज सम क्वेरी - अपरिवर्तनीय


मान लीजिए हमारे पास एक 2D मैट्रिक्स है जिसे matrix कहा जाता है, हमें (row1, col1) ऊपरी बाएं कोने और (row2, col2) निचले दाएं कोने द्वारा परिभाषित आयत के अंदर के तत्वों का योग ढूंढना है।

उदाहरण के लिए, यदि मैट्रिक्स है:

30142
56321
12015
41017
10305

नीले रंग से चिह्नित आयत (2,1) और (4,3) द्वारा परिभाषित है, इसका योग 8 है।

यदि हम sumRegion(2, 1, 4, 3), sumRegion(1, 1, 2, 2), sumRegion(1, 2, 2, 4) क्वेरी करते हैं, तो ये क्रमशः 8, 11, 12 वापस करेंगे।

हल करने के चरण

  • dp नामक एक मैट्रिक्स परिभाषित करें

  • प्रारंभिककरण:

  • n := पंक्तियों की संख्या, यदि n 0 है तो वापस लौटें

  • m := स्तंभों की संख्या

  • dp := n x m आकार का एक अन्य मैट्रिक्स

  • i को 0 से n-1 तक लूप करें

    • j को 0 से m-1 तक लूप करें

      • यदि j-1 < 0, तो dp[i][j] = matrix[i][j], अन्यथा dp[i][j] = dp[i][j-1] + matrix[i][j]

  • i को 1 से n-1 तक लूप करें

    • j को 0 से m-1 तक लूप करें

      • dp[i][j] में dp[i-1][j] जोड़ें

  • क्वेरी विधि row1, col1, row2, col2 लेती है

  • ret := dp[row2][col2]

  • sub1 := 0 यदि row1-1 < 0, अन्यथा dp[row1-1][col2]

  • sub2 := 0 यदि col1-1 < 0, अन्यथा dp[row2][col1-1]

  • यदि row1-1 < 0 या col1-1 < 0, तो add := 0, अन्यथा add := dp[row1-1][col1-1]

  • ret - sub1 - sub2 + add वापस करें

उदाहरण (C++)

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

#include <bits/stdc++.h> using namespace std; class NumMatrix {    public:    vector < vector <int>> dp;    NumMatrix(vector<vector<int>>& matrix) {       int n = matrix.size();       if(!n) return;       int m = matrix[0].size();       dp = vector < vector <int>>(n, vector <int> (m));       for(int i = 0; i < n; i++){          for(int j = 0 ;j < m; j++){             dp[i][j] = j - 1 < 0 ? matrix[i][j] : dp[i][j - 1] + matrix[i][j];          }       }       for(int i = 1; i < n; i++){          for(int j = 0; j < m; j++){             dp[i][j] += dp[i - 1][j];          }       }    }    int sumRegion(int row1, int col1, int row2, int col2) {       int ret = dp[row2][col2];       int sub1 = row1 - 1 < 0 ? 0 : dp[row1 - 1][col2];       int sub2 = col1 - 1 < 0 ? 0 : dp[row2][col1 - 1];       int add = row1 - 1 < 0 || col1 - 1 < 0 ? 0 : dp[row1 - 1][col1 - 1];       return ret - sub1 - sub2 + add;    } }; main(){    vector<vector<int>> mat = {{3,0,1,4,2},{5,6,3,2,1},{1,2,0,1,5},{4,1,0,1,7},{1,0,3,0,5}};    NumMatrix ob(mat);    cout << ob.sumRegion(2,1,4,3) << endl;    cout << ob.sumRegion(1,1,2,2) << endl;    cout << ob.sumRegion(1,2,2,4) << endl; }

इनपुट

[[3,0,1,4,2], [5,6,3,2,1], [1,2,0,1,5], [4,1,0,1,7], [1,0,3,0,5]] sumRegion(2,1,4,3) sumRegion(1,1,2,2) sumRegion(1,2,2,4)

आउटपुट

8 11 12
  1. - C++ में दिए गए रेंज के लिए अधिकतम प्रीफिक्स-सम

    समस्या कथनn पूर्णांकों का एक एरे और q क्वेरी दी गई हैं, प्रत्येक क्वेरी में l से r तक की एक रेंज होती है। रेंज l – r के लिए अधिकतम प्रीफिक्स-सम ढूंढें।उदाहरणयदि इनपुट एरे arr[] = {-1, 2, 3, -5} है और क्वेरी = 2 और रेंज हैं: l = 0, r = 3 l = 1, r = 3 तो आउटपुट 4 और 5 होगा।पहली क्वेरी में रेंज (

  1. - C++ में रेंज सम क्वेरी - अपरिवर्तनीय

    मान लीजिए हमारे पास पूर्णांकों का एक ऐरे है। हमें इंडेक्स i से j तक मौजूद तत्वों का योग ढूंढना है। दो बातें ध्यान में रखनी हैं कि ऐरे अपरिवर्तनीय होगा, इसलिए तत्व बदले नहीं जाएंगे, और ऐसी कई क्वेरी होंगी। इसलिए हमें बड़ी संख्या में क्वेरी के लिए निष्पादन समय का ध्यान रखना होगा। मान लीजिए ऐरे A = [5

  1. - C++ में एलिक्वॉट योग (Aliquot Sum)

    यहां हम देखेंगे कि एलिक्वॉट योग क्या है? n का एलिक्वॉट योग n को छोड़कर n के सभी पूर्ण गुणनखंडों का योग है। उदाहरण के लिए, यदि संख्या 20 है, तो पूर्ण गुणनखंड (1, 2, 4, 5, 10) हैं। तो एलिक्वॉट योग 22 है। एक दिलचस्प तथ्य यह है कि, यदि किसी संख्या का एलिक्वॉट योग संख्या स्वयं है, तो वह संख्या एक पूर्ण