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

C++ में वृत्ताकार सरणी लूप


मान लीजिए हमारे पास धनात्मक और ऋणात्मक पूर्णांकों की एक वृत्ताकार सरणी nums है। यदि इंडेक्स पर संख्या k धनात्मक है, तो k कदम आगे बढ़ें। यदि ऋणात्मक (-k) है, तो k कदम पीछे जाएँ। सरणी वृत्ताकार है। हमें जांचना है कि क्या nums में एक लूप (चक्र) मौजूद है। एक चक्र की लंबाई > 1 होनी चाहिए और उसी इंडेक्स पर शुरू और खत्म होना चाहिए।

उदाहरण: [2,-1,1,2,2] → true (चक्र: 0 → 2 → 3 → 0, लंबाई 3)।

फास्ट-स्लो पॉइंटर (फ्लॉयड का चक्र खोज)

  1. n = nums.size()। यदि n < 2 तो false।
  2. सभी तत्वों को nums[i] %= n करें (कदमों को सामान्य करें)।
  3. प्रत्येक इंडेक्स i के लिए:
    • यदि nums[i] == 0, तो जारी रखें।
    • slow = i, fast = i।
    • while nums[slow]*nums[fast] > 0 && nums[next(fast)]*nums[slow] > 0 (समान दिशा):
      • slow = next(slow), fast = next(next(fast))।
      • यदि slow == fast:
        • यदि slow == next(slow) (लंबाई 1), तो ब्रेक।
        • true लौटाएँ।
    • दिशा बदलने वाले सभी नोड्स को 0 से मार्क करें (विज़िटेड)।
  4. false लौटाएँ।

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

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

class Solution {
public:
    int next(vector<int>& nums, int i) {
        int n = nums.size();
        return (n + nums[i] + i) % n;
    }
    
    bool circularArrayLoop(vector<int>& nums) {
        int n = nums.size();
        if (n < 2) return false;
        for (int i = 0; i < n; i++) nums[i] %= n;
        
        for (int i = 0; i < n; i++) {
            if (nums[i] == 0) continue;
            int slow = i, fast = i;
            while (nums[slow] * nums[fast] > 0 && nums[next(nums, fast)] * nums[slow] > 0) {
                slow = next(nums, slow);
                fast = next(nums, next(nums, fast));
                if (slow == fast) {
                    if (slow == next(nums, slow)) break;
                    return true;
                }
            }
            // मार्क विज़िटेड
            int x = nums[i];
            slow = i;
            while (nums[slow] * x > 0) {
                int temp = next(nums, slow);
                nums[slow] = 0;
                slow = temp;
            }
        }
        return false;
    }
};

int main() {
    vector<int> v = {2,-1,1,2,2};
    Solution ob;
    cout << ob.circularArrayLoop(v); // 1 (true)
    return 0;
}

इनपुट

[2,-1,1,2,2]

आउटपुट

1
  1. - C++ में सरणी का उपयोग करके कतार (Queue) का कार्यान्वयन

    कतार क्या है? कतार एक रैखिक डेटा संरचना है जो FIFO (पहले अंदर, पहले बाहर) सिद्धांत का पालन करती है। सरणी कार्यान्वयन दो पॉइंटर्स: front (हटाने के लिए) और rear (जोड़ने के लिए)। Enqueue: rear पर तत्व जोड़ें, rear++ Dequeue: front से तत्व हटाएं, सभी तत्वों को बाएं शिफ्ट करें, rear-- Overflow: rear =

  1. - C++ में स्ट्रिंग्स की सरणी

    इस खंड में हम देखेंगे कि C++ में स्ट्रिंग्स की सरणी को कैसे परिभाषित किया जाए। जैसा कि हम जानते हैं कि C में कोई स्ट्रिंग्स नहीं थीं। हमें कैरेक्टर सरणी का उपयोग करके स्ट्रिंग्स बनानी पड़ती थीं। इसलिए कुछ स्ट्रिंग्स की सरणी बनाने के लिए, हमें कैरेक्टर्स की 2-आयामी सरणी बनानी पड़ती थी। प्रत्येक पंक्

  1. - C++ में सॉर्टिंग

    इस सेक्शन में हम देखेंगे कि C++ में सॉर्टिंग एल्गोरिदम कैसे निष्पादित करें। एक सॉर्टेड ऐरे एक ऐरे है जिसमें प्रत्येक एलिमेंट किसी क्रम में सॉर्टेड होते हैं जैसे न्यूमेरिकल, अल्फाबेटिकल आदि। एक न्यूमेरिकल ऐरे को सॉर्ट करने के लिए कई एल्गोरिदम हैं जैसे बबल सॉर्ट, इन्सर्शन सॉर्ट, सिलेक्शन सॉर्ट, मर्ज स