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

C++ में 2D मैट्रिक्स में खोज (Search a 2D Matrix)


मान लीजिए हमें एक कुशल एल्गोरिदम लिखना है जो m x n मैट्रिक्स में एक मान खोजता है। इस मैट्रिक्स के कुछ गुण हैं:

  • प्रत्येक पंक्ति बाएं से दाएं क्रमबद्ध है
  • प्रत्येक पंक्ति का पहला नंबर पिछली पंक्ति के अंतिम पूर्णांक से बड़ा है।

यदि मैट्रिक्स इस तरह है:

1357
10111620
23303450
53627898

और यदि लक्ष्य मान 16 है, तो आउटपुट True होगा।

आइए चरण देखें:

  • n := पंक्तियों की संख्या, यदि n 0 है, तो false वापस करें, m := कॉलम की संख्या, यदि m = 0, तो false वापस करें
  • low := 0 और high := n – 1
  • जब तक low < high:
    • mid := low + (high – low + 1)/2
    • यदि mat[mid, 0] <= target, तो low := mid, अन्यथा high := mid – 1
  • rlow := 0 और rhigh := m – 1 और ans := 0
  • जब तक rlow <= rhigh:
    • mid := rlow + (rhigh - rlow)/2
    • यदि mat[low, mid] = target, तो ans := 1, और लूप तोड़ें
    • अन्यथा जब matrix[low, mid] < target, तो rlow := mid + 1
    • अन्यथा rhigh := mid – 1
  • ans वापस करें

उदाहरण

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

typedef long long int lli;

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        lli n, m;
        n = matrix.size();
        if(!n) return false;
        m = matrix[0].size();
        if(!m) return false;
        lli low = 0, high = n-1;
        while(low < high){
            lli mid = low + (high - low + 1)/2;
            if(matrix[mid][0] <= target) low = mid;
            else high = mid - 1;
        }
        lli rlow = 0, rhigh = m-1;
        lli ans = 0;
        while(rlow <= rhigh){
            lli mid = rlow + (rhigh - rlow)/2;
            if(matrix[low][mid] == target){
                ans = 1;
                break;
            } else if(matrix[low][mid] < target) rlow = mid + 1;
            else rhigh = mid - 1;
        }
        return ans;
    }
};

int main(){
    Solution ob;
    vector<vector<int>> v = {{1,3,5,7},{10,11,16,20},{23,30,34,50},{53,62,78,98}};
    cout << ob.searchMatrix(v, 16);
}

इनपुट

[[1,3,5,7],[10,11,16,20],[23,30,34,50],[53,62,78,98]] 16

आउटपुट

1
  1. C++ में मैट्रिक्स की पंक्ति-वार बनाम स्तंभ-वार ट्रैवर्सल C++ में मैट्रिक्स की पंक्ति-वार बनाम स्तंभ-वार ट्रैवर्सल

    एक मैट्रिक्स को दो तरीकों से ट्रैवर्स किया जा सकता है। पंक्ति-वार ट्रैवर्सल प्रत्येक पंक्ति को एक-एक करके पहले पंक्ति से शुरू करके अंतिम पंक्ति तक देखता है। पंक्ति में तत्व इंडेक्स 0 से अंतिम इंडेक्स तक लौटाए जाते हैं। स्तंभ-वार ट्रैवर्सल में, तत्वों को पहले स्तंभ से अंतिम स्तंभ तक क्रम में ट्रैवर्स

  1. C++ में बाइनरी सर्च ट्री को पुनर्प्राप्त करना C++ में बाइनरी सर्च ट्री को पुनर्प्राप्त करना

    मान लीजिए हमारे पास एक बाइनरी सर्च ट्री (BST) है, अब इस BST के दो तत्वों को आपस में बदल दिया गया है, इसलिए हमें इस बाइनरी सर्च ट्री को पुनर्प्राप्त करना होगा। यदि दिया गया ट्री पहले जैसा है, तो पुनर्प्राप्त ट्री दूसरे जैसा होगा। हल करने का दृष्टिकोण इस समस्या को हल करने के लिए हम निम्नलिखित चरणों क

  1. C++ में बाइनरी खोज प्रोग्राम C++ में बाइनरी खोज प्रोग्राम

    बाइनरी खोज क्या है? बाइनरी खोज (आधा-अंतराल खोज) एक खोज एल्गोरिदम है जो क्रमबद्ध सरणी में लक्ष्य मान की स्थिति ढूंढता है। यह लक्ष्य मान की तुलना मध्य तत्व से करता है और खोज स्थान को आधा कर देता है। मुख्य बिंदु केवल क्रमबद्ध सरणी पर काम करता है समय जटिलता: O(log n) दुनिया के सभी नाम क्रमबद्ध हों तो