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

C++ में रेंज एडिशन - अंतर सरणी तकनीक


समस्या विवरण

मान लीजिए हमारे पास आकार n की एक सरणी है जो 0 से इनिशियलाइज़ है और हमारे पास एक मान k है, हम k अपडेट ऑपरेशन करेंगे। प्रत्येक ऑपरेशन को ट्रिपलेट के रूप में दर्शाया जाएगा: [startIndex, endIndex, inc] जो सबएरे A[startIndex ... endIndex] (startIndex और endIndex समावेशी) के प्रत्येक तत्व को inc से बढ़ाता है। हमें सभी k ऑपरेशन निष्पादित होने के बाद संशोधित सरणी ढूंढनी है।

उदाहरण के लिए, यदि इनपुट length = 5, updates = [[1,3,2],[2,4,3],[0,2,-2]] है, तो आउटपुट [-2,0,3,5,3] होगा।

समाधान दृष्टिकोण

अंतर सरणी (Difference Array) तकनीक का उपयोग करके O(n + k) समय में:

  1. आकार n की एक सरणी ret परिभाषित करें
  2. प्रत्येक अपडेट के लिए:
    • l := a[i][0]
    • r := a[i][1] + 1
    • ret[l] := ret[l] + a[i][2]
    • यदि r < n, तो ret[r] := ret[r] - a[i][2]
  3. प्रत्येक i के लिए 1 से n-1 तक: ret[i] := ret[i] + ret[i-1]
  4. ret लौटाएं

C++ कार्यान्वयन

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

void print_vector(vector<auto> v){ 
    cout << "["; 
    for(int i = 0; i<v.size(); i++){ 
        cout << v[i] << ", "; 
    } 
    cout << "]"<<endl; 
} 

class Solution { 
public: 
    vector<int> getModifiedArray(int n, vector<vector<int>>& a) { 
        vector<int> ret(n); 
        for (int i = 0; i < a.size(); i++) { 
            int l = a[i][0]; 
            int r = a[i][1] + 1; 
            ret[l] += a[i][2]; 
            if (r < n) { 
                ret[r] -= a[i][2]; 
            } 
        } 
        for (int i = 1; i < n; i++) { 
            ret[i] += ret[i - 1]; 
        } 
        return ret; 
    } 
}; 

int main(){ 
    Solution ob; 
    vector<vector<int>> v = {{1,3,2},{2,4,3},{0,2,-2}}; 
    print_vector(ob.getModifiedArray(5,v)); 
    return 0;
}

इनपुट

5, {{1,3,2},{2,4,3},{0,2,-2}}

आउटपुट

[-2, 0, 3, 5, 3, ]
  1. C++ में लाइन रिफ्लेक्शन - Y-अक्ष के समानांतर सममित रेखा जांचें C++ में लाइन रिफ्लेक्शन - Y-अक्ष के समानांतर सममित रेखा जांचें

    समस्या विवरण मान लीजिए हमारे पास 2D तल पर n बिंदु हैं, हमें जांचना है कि क्या y-अक्ष के समानांतर कोई रेखा है जो दिए गए बिंदुओं को सममित रूप से प्रतिबिंबित करती है, दूसरे शब्दों में, जांचें कि क्या कोई ऐसी रेखा मौजूद है जो सभी बिंदुओं को दी गई रेखा पर प्रतिबिंबित करने के बाद मूल बिंदुओं का समुच्चय प

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

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

  1. - C++ में static_cast

    static_cast का उपयोग सामान्य/साधारण प्रकार रूपांतरण के लिए किया जाता है। यह निहित प्रकार जबरदस्ती (implicit type coercion) के लिए भी जिम्मेदार कास्ट है और इसे स्पष्ट रूप से भी बुलाया जा सकता है। आपको इसका उपयोग फ्लोट को इंट में, चार को इंट में आदि जैसे मामलों में करना चाहिए। यह संबंधित प्रकार के क्