🎁 अभी साइन अप करें और ऑनलाइन AI के अधिकतम 30 मिनट मुफ्त पाएं। क्रेडिट कार्ड की जरूरत नहीं।

क्लोन ग्राफ (LeetCode 133): पायथन में हैश मैप के साथ DFS

October 9, 2026
क्लोन ग्राफ (LeetCode 133) के लिए परीक्षित पायथन समाधान, हैश मैप और डेप्थ-फर्स्ट सर्च का उपयोग करते हुए, साइकल के लिए मैप क्यों आवश्यक है, सामान्य गलतियाँ, और इसे कैसे समझाएँ।
क्लोन ग्राफ (LeetCode 133): पायथन में हैश मैप के साथ DFS
clone graph leetcode
leetcode 133
clone graph python
deep copy graph

Clone Graph (LeetCode 133) में आपको एक connected undirected graph की deep copy return करनी होती है। मुख्य विचार है हर original node से उसके copy तक जाने वाला hash map। इससे आप हर copy एक ही बार बनाते हैं और cycles पर हमेशा के लिए loop किए बिना neighbors को जोड़ देते हैं। Time और space O(V + E) हैं।

समस्या

आपको एक connected undirected graph के एक node का reference मिलता है। हर node की एक value और neighbors की एक list होती है। एक deep copy return करें: समान values और समान connections वाले नए nodes, और original के साथ कोई node साझा न हो। Input None भी हो सकता है, उस स्थिति में None return करें।

Node class ऐसा दिखता है:

class Node:
    def __init__(self, val=0, neighbors=None):
        self.val = val
        self.neighbors = neighbors if neighbors is not None else []

यह सिर्फ़ recursion क्यों नहीं है

एक graph में cycles हो सकते हैं, और undirected graph में हर edge एक छोटा cycle होता है (A में B है, और B में A)। ऐसा copy function जो हर neighbor पर खुद को call करता है, कभी रुकेगा नहीं। आपको याद रखना होगा कि कौन-से nodes पहले ही copy हो चुके हैं।

एक dictionary copies रखें जो हर original node को उसके clone से map करती है। एक stack के साथ graph में चलें। जब आपको ऐसा neighbor मिले जिसे आपने copy नहीं किया है, उसका clone बनाएँ और उसे push करें। किसी भी तरह, neighbor के clone को current clone की neighbor list में जोड़ दें।

class Node:
    def __init__(self, val=0, neighbors=None):
        self.val = val
        self.neighbors = neighbors if neighbors is not None else []

def clone_graph(node):
    if node is None:
        return None
    copies = {node: Node(node.val)}
    stack = [node]
    while stack:
        cur = stack.pop()
        for nb in cur.neighbors:
            if nb not in copies:
                copies[nb] = Node(nb.val)
                stack.append(nb)
            copies[cur].neighbors.append(copies[nb])
    return copies[node]

Trace

एक square graph लें, 1, 2 और 4 से जुड़ा है, 2, 3 से, 3, 4 से। Node 1 से शुरू करें: copy 1 बनाएँ, फिर node 1 के neighbors 2 और 4 पर जाएँ, दोनों के copies बनाएँ और उन्हें copy 1 से जोड़ें। Node 4 pop करें: इसके neighbors 1 और 3 हैं, तो copy 1 जुड़ जाता है (पहले से मौजूद है), और copy 3 बनाकर जोड़ दिया जाता है। Node 3, फिर node 2 pop करें, और बाकी links जुड़ जाते हैं। हर node एक बार बनता है, और हर edge दोनों दिशाओं में दिखता है, क्योंकि हर endpoint दूसरे को अपनी list में जोड़ता है।

Depth-first या breadth-first

दोनों काम करते हैं। Breadth-first के लिए stack को deque और popleft() से बदल दें। एकमात्र ज़रूरत map है। Recursion लिखने में छोटा होता है, लेकिन गहरा graph Python की recursion limit तक पहुँच सकता है, इसलिए iterative version ज़्यादा सुरक्षित है।

Iterative (stack या queue)Recursive
TimeO(V + E)O(V + E)
Spacemap और stack के लिए O(V)map के लिए O(V) और call stack depth
जोखिमबड़े graphs के लिए कोई नहींलंबी chains पर recursion depth

आम गलतियाँ

  • हर बार node दिखने पर नया clone बनाना, जिससे nodes duplicate हो जाते हैं और loop कभी खत्म नहीं होता।
  • Neighbor list को reference से copy करना, जिससे clone वापस original nodes की ओर इशारा करता है।
  • None input भूल जाना।
  • Node value को map key की तरह इस्तेमाल करना जब values के unique होने की गारंटी न हो। Node object खुद इस्तेमाल करना ज़्यादा सुरक्षित है।

Test करने के लिए edge cases

Inputअपेक्षित
NoneNone
बिना neighbors वाला एक single nodeएक नया single node
एक-दूसरे से जुड़े दो nodesएक-दूसरे की ओर इशारा करते दो नए nodes
एक cycle या एक cliqueहर edge सुरक्षित, कोई साझा node नहीं

Interview में इसे कैसे समझाएँ

  1. बताएँ कि यहाँ deep copy का क्या मतलब है: नए nodes, वही shape।
  2. Cycles की ओर इशारा करें और बताएँ कि map क्यों चाहिए।
  3. Original से clone तक के map, और traversal का वर्णन करें।
  4. इसे लिखें, फिर दो-node वाले उदाहरण से चलकर दिखाएँ।
  5. O(V + E) time और O(V) space बताएँ।

मैंने publish करने से पहले ऊपर दिए गए code को 3,000 random connected graphs पर test किया, यह जाँचते हुए कि copy में वही values और edges हैं और original के साथ कोई node साझा नहीं है। ऐसा त्वरित random check अभ्यास करते समय एक अच्छी आदत है।

संबंधित अभ्यास

Complexity की शब्दावली के लिए हमारी Big O cheat sheet देखें, आगे क्या अभ्यास करें इसके लिए LeetCode Blind 75 list, और अभ्यास कैसे करें इसके लिए coding interview assistant guide देखें।

कोड करते समय अपना तरीका ज़ोर से बोलकर समझाएँ। एक transcript दिखाता है कि आपने लिखने से पहले मुख्य observation बताया या नहीं। किसी भी live assessment में AI tools पर employer के नियमों का पालन करें।

YesToTheOffer के साथ कोडिंग इंटरव्यू का अभ्यास करें

अपना दृष्टिकोण ज़ोर से समझाएँ, फिर बाद में अपना ट्रांसक्रिप्ट समीक्षा करें। 30 मुफ्त मिनट, कोई सब्सक्रिप्शन नहीं।

iOS & Android — जल्द आ रहा है
कीमतें देखें

ब्लॉग पोस्ट

कोडिंग इंटरव्यू के लिए बिग ओ चीट शीट: डेटा स्ट्रक्चर, सॉर्टिंग, और पैटर्न
Public
Aug 10, 2026

कोडिंग इंटरव्यू के लिए बिग ओ चीट शीट: डेटा स्ट्रक्चर, सॉर्टिंग, और पैटर्न

कोडिंग इंटरव्यू के लिए बिग ओ चीट शीट जिसमें ग्रोथ रेट, डेटा स्ट्रक्चर और सॉर्टिंग कॉम्प्लेक्सिटी, सामान्य कोड पैटर्न, Python लागत, और उनकी गणना कैसे करें शामिल है।

ब्लाइंड 75: कोडिंग इंटरव्यू के लिए एक पैटर्न-आधारित अध्ययन योजना
Public
Aug 15, 2026

ब्लाइंड 75: कोडिंग इंटरव्यू के लिए एक पैटर्न-आधारित अध्ययन योजना

ब्लाइंड 75 LeetCode सूची के लिए पैटर्न-दर-पैटर्न अध्ययन योजना, जिसमें छह सप्ताह का शेड्यूल, प्रत्येक समस्या का अभ्यास करने की विधि, और सूची में क्या छूट गया है, शामिल है।

कोसाराजू का एल्गोरिद्म: दृढ़ता से जुड़े घटकों की मार्गदर्शिका
Public
Aug 22, 2026

कोसाराजू का एल्गोरिद्म: दृढ़ता से जुड़े घटकों की मार्गदर्शिका

कोसाराजू का एल्गोरिद्म दो DFS पास में दृढ़ता से जुड़े घटकों को कैसे ढूंढता है, एक काम किया उदाहरण, परीक्षण किया गया Python कोड, जटिलता, और सामान्य गलतियों के साथ।