2015-07-03 9 views
9

के साथ सबसे बड़ा subarray ढूँढना तो, मैं केवल 0 और 1 के युक्त एक सरणी है। मुझे सबसे बड़ा सबराय पता होना चाहिए जिसमें बराबर संख्या 0 और 1 है। एक हो सकता है एक अनुभवहीन दृष्टिकोण O(n^2) जहाँ मैं बाहरी पाश में हर तत्व लेने के लिए और भीतरी पाश में संभव subarrays की गणना और अधिकतम आकार को अद्यतन करने के रखने के लिए, यदि पाया के रूप में जटिलता है। क्या कोई अन्य बेहतर दृष्टिकोण है (ओ (एन) जैसे कुछ) जिसका मैं उपयोग कर सकता हूं? धन्यवाद!0 की संख्या के बराबर और 1 के

Input: arr[] = {1, 0, 1, 1, 1, 0, 0} 
Output: 1 to 6 (Starting and Ending indexes of output subarray) 

उत्तर

14

यहां एक ओ (एन) -टाइम, ओ (एन)-स्पेस एल्गोरिदम है। मुझे यकीन नहीं है कि यह इष्टतम है, लेकिन यह वर्गबद्ध समय धड़कता है।

मूल विचार इस प्रकार है। मान लीजिए कि आप प्रत्येक चरण में सरणी के बाएं से दाएं रिकॉर्डिंग तक स्कैन करते हैं, 1s की संख्या और 0 की संख्या के बीच का अंतर। आप प्रत्येक चरण में इन मूल्यों को लिखने, तो आप इस तरह कुछ मिल जाएगा:

1, 0, 1, 0, 0, 0, 0 
0, 1, 0, 1, 0, -1, -2, -3 

आप 0s और 1s, की समान संख्या तो कम से 0s और 1s का शुद्ध अंतर के साथ एक उप सरणी है, तो subarray की शुरुआत subarray के बाद शुद्ध संख्या के बराबर होगी। इसलिए, इस समस्या को सहायक सरणी में दो समान मानों को खोजने की कोशिश के रूप में दोहराया जा सकता है जो बराबर और यथासंभव दूर हैं।

अच्छी खबर यह है कि सरणी में प्रत्येक प्रविष्टि -n और + n के बीच होती है, ताकि आप 2 एन + 1 तत्व तालिका बना सकें और इसमें प्रत्येक नंबर दिखाई देने वाले पहले और आखिरी बार के सूचकांक स्टोर कर सकें। वहां से, सबसे लंबी दूरी को ढूंढना आसान है। कुल मिलाकर, इसे ओ (एन) स्पेस की आवश्यकता होती है और ओ (एन) समय में सब कुछ पॉप्युलेट और खोजा जा सकता है।

आशा है कि इससे मदद मिलती है!

+0

ठीक है, यह करेगा। हाँ। महान विचार :) –

+0

क्या निम्नलिखित के अनुक्रम के बारे में: '0 0 0 0 1 0 1 0 0 0' –

+0

कि सरणी 0 देना होगा, -1, -2, -3, -4, -3, -4, - 3, -4, -5, -6। या तो -3 द्वारा सीमित सीमा या -4 द्वारा सीमित सीमा आपको वह चीज़ देगी जो आप खोज रहे थे। हालांकि शायद मुझे कुछ याद आ रहा है? – templatetypedef

5

पहले अपने शून्य को -1 में परिवर्तित करें। फिर आप शून्य राशि के अधिकतम सबएरे की तलाश में हैं। इसके लिए एक एल्गोरिदम here

+0

लेकिन फिर, यह सब के रूप में योग के साथ 0 और अधिकतम लंबाई के साथ आने के साथ कुछ सब कुछ मिल जाएगा। एक subarray ही ढूँढना हे (एन) समय जटिलता है और (सबसे खराब स्थिति में, एन बार, मुझे लगता है) यह O (n^2) फिर से बनाने तो मैं यह कर देगा। –

+0

यदि आप मेरे द्वारा दिए गए लिंक को देखते हैं तो आप देखेंगे कि वहां एक ओ (एन) उत्तर है। लेकिन दूसरी जवाब इस समस्या का अधिक विशिष्ट और बेहतर है ... – vib

+1

कड़ी में एल्गोरिथ्म पहले subarray, नहीं सबसे लंबे समय तक subarray पाता है। इसके अलावा, यह डेटा की बाइनरी प्रकृति को स्वीकार नहीं करता है। –

2
public int equalNumber(int arr[]){ 

    int sum[] = new int[arr.length]; 
    sum[0] = arr[0] == 0? -1 : 1; 
    for(int i=1; i < sum.length; i++){ 
     sum[i] = sum[i-1] + (arr[i] == 0? -1 : 1); 
    } 

    Map<Integer,Integer> pos = new HashMap<Integer,Integer>(); 
    int maxLen = 0; 
    int i = 0; 
    for(int s : sum){ 
     if(s == 0){ 
      maxLen = Math.max(maxLen, i+1); 
     } 
     if(pos.containsKey(s)){ 
      maxLen = Math.max(maxLen, i-pos.get(s)); 
     }else{ 
      pos.put(s, i); 
     } 
     i++; 
    } 
    return maxLen; 
} 
+0

यदि कुछ प्रश्नों के बारे में कुछ सवाल और संपादित जटिलता के बारे में कुछ चर्चा के साथ संपादित किया गया तो इसमें सुधार किया जा सकता है। – paisanco

+0

में उपरोक्त में पूछा गया है कि किसी के पास कोई बेहतर दृष्टिकोण है, मेरे पास यह है इसलिए मैंने इसे साझा किया .. – SWAR0714

+1

https://discuss.leetcode.com/topic/25465/longest-continous-zero-sum-subarray/6 से कॉपी किया गया # – EmptyData

संबंधित मुद्दे