سيٽلائيٽ آرٽ ليٽ ڪوڊ


تڪليف جي سطح وچولو
بار بار پڇڻ ۾ Amazon ڪريو گوگل
ڪيريو هاشمي

مسئلي جو بيان

"لاڳيتو آرري ليٽ ڪوڊ" مسئلو ٻڌائي ٿو ته توهان کي هڪ ڏني وئي آهي صف ڪ [n] سائيز جي 1 تي مشتمل آهي صرف 0 ۽ XNUMX جي. ڳوليو تمام وڏو ڳائڻو جنهن ۾ 1's جو تعداد 0 جي تعداد جي برابر آهي.

مثال

سيٽلائيٽ آرٽ ليٽ ڪوڊ

a[ ] = {1, 0, 1, 1, 1, 0, 0}
1 to 6

وضاحت: انڊيڪس 1 کان 6 تائين هڪ سبري کي چونڊڻ اسان کي ڊگهو نتيجو جو بهترين نتيجو ڏئي ٿو 6. 1 کان 6 انڊيڪس تائين ملندڙ سرشتون 3 صفر ۽ 3 آهن. هتي اسان 0 XNUMX بنياد واري انڊسٽنگ تي غور ڪيو آهي.

a[ ] = {1, 1}
No such subarray

چرچو

نائو طريقو

سڀ ممڪن سبجيڪٽ ٺاھيو. چيڪ ڪريو جيڪڏهن ڪو به وجود موجود آهي جنهن ۾ 1 جو نمبر 0 جي عدد جي برابر آهي. اسان استعمال ڪندا آهيون ٻه اشارو آئون ۽ ج هڪ سب وي جي بائیں ۽ سا boundي حد جي لاءِ. ته پوءِ اسان جانچ ڪيون ٿا ته آءِ جي کان سبيري جي مجموعي جو مجموعو = 0 آهي ، 0 کان پوءِ 1 کي بدلائڻ جي. جيڪڏھن اھو سچ آھي ، اسان کي ھڪ ذيلي ملاح ملي آھي جيڪا حالتن کي پورو ڪري ٿي. هاڻي اسان پنهنجو جواب اپڊيٽ ڪيو.

مربوط سر ليٽڪوڊ مسئلي جي لاءِ الگورٿم

1. Initialize a binary array a[] of size n and three variables sum, max=-1, and start.
2. Traverse through the array and update sum as -1 if a[i] is 0 else 1.
3. Traverse the inner loop and add -1 in sum if a[i] is 0 else 1.
4. Check if the sum is 0 and max is less than j-i+1, update max as j-i+1 and start as i.
5. Outside the loops check if max is -1 print "No such subarray" else print starting and ending index.

ڪوڊ

سي ++ پروگرام حل ڪندڙ آرري ليوٽ ڪوڊ جو مسئلو حل ڪرڻ ۾
#include <bits/stdc++.h> 
using namespace std; 
  
int subArray(int a[], int n){ 
    int sum = 0; 
    int max = -1, start; 
  
    for(int i=0; i<n-1; i++){ 
        sum = (a[i]==0) ? -1 : 1; 
  
        for(int j=i+1; j<n; j++){ 
            (a[j]==0) ? (sum+=-1) : (sum+=1); 
  
            if(sum == 0 && max < j-i+1){ 
                max = j-i+1; 
                start = i; 
            } 
        } 
    } 
    if(max == -1) 
        cout<<"No such subarray"; 
    else
        cout<<start<<" to "<<start+max-1; 
  
    return max; 
} 
  
int main(){ 
    int a[] = { 1, 0, 1, 1, 1, 0, 0 }; 
    int n = sizeof(a) / sizeof(a[0]); 
  
    subArray(a, n); 
    return 0; 
}
1 to 6
جاوا پروگرام لٽاريل آرري ليٽ ڪوڊ جو مسئلو حل ڪرڻ ۾
class LongestSubArray{
    int subArray(int a[], int n){ 
        int sum = 0; 
        int max = -1, start=0,end=0; 
        
        for(int i=0; i<n-1; i++){ 
            sum = (a[i]==0) ? -1 : 1; 
            
            for(int j=i+1; j<n; j++){ 
                if(a[j] == 0) 
                    sum += -1; 
                else
                    sum += 1;  
                
                if(sum == 0 && max < j-i+1){ 
                    max = j-i+1; 
                    start = i; 
                } 
            } 
        } 
        if(max == -1) 
            System.out.println("No such subarray");
        else
            end = start+max-1;
            System.out.println(start+" to "+end);
        
        return max; 
    } 
    public static void main(String[] args){ 
        LongestSubArray s = new LongestSubArray(); 
        int a[] = { 1, 0, 1, 1, 1, 0, 0 }; 
        int n = a.length; 
        
        s.subArray(a, n); 
    } 
}
1 to 6

پيچيدگي تجزيي

وقت جي پيچيدگي

هتان کان اسان هڪ پوائنٽ مقرر ڪندي رهندي صف جو رخ ڪري رهيا هئاسين. اسان ھڪڙي پولينوميل ٽائيم پيچيدگين حاصل ڪيو  اي (اين2) جتي ڏنل ڏنل صف ۾ عناصر جو تعداد a [].

خلائي پيچيدگي

اي (1) ڇاڪاڻ ته اسان مسلسل اضافي جڳهه استعمال ڪيو. اسان رڳو جي تسلسل جو هڪ قبيح پيدا ڪيو. پر شروعاتي انٽ صف کان سواءِ ٻيو ڪوبه آرٽ استعمال نه ڪيو. پر انهي پروگرام ۾ مجموعي طور تي اي (اين) جي خلائي پيچيدگي آهي ڇاڪاڻ ته اسان ان پٹ عنصرن کي اسٽور ڪرڻ لاءِ هڪ قطار استعمال ڪئي.

هش نقشو استعمال ڪندي

مربوط سر ليٽڪوڊ مسئلي جي لاءِ الگورٿم

1. Initialize a binary array a[] of size n.
2. Initialize an unordered map.
3. Traverse through the array and update the array value of the current index as -1 if current value if 0 else 1.
4. Traverse through the array and add the elements.
5. If the sum is 0, update max as i+1 and end as i.
6. Else Traverse map and update max as i - map(sum+n) and end as i if max is less than i - map(sum+n) else update map(sum+n) as i.
7. Traverse through the array and update the array value of the current index as 0 if current value is -1 else 1.
8. If the end is greater than -1 print starting and ending index.
9. Else print "No such subarray".

جيڪو اسان هتي ڪيو آهي ، بس جڏهن اسان کي سڀ کان وڏي سبري جي رقم ڳولهڻ جي ضرورت آهي 0. جيڪو اسان ڪيو آهي اهو اڳيون رقم وٺون ٿا ۽ اسان جو نقشو چوڪ تي لڳايو ٿا جيڪڏهن اتي ڪنهن جاءِ تي هجي جتي اسان ساڳيون رقم ڳولي سگهون. ان کان پوء نقشي +1 کان هاڻوڪي انڊيڪس ۾ ويليو کان شروع ٿيندڙ سبريري رقم 0 آھي. ھتي ، اسان کي استعمال ڪري رھيا آھيون. پر اسان به سڌي مقدار کي استعمال ڪري سگھياسين. پر جيڪڏهن اسان ڪتب جي طور تي (رقم + ن) استعمال ڪريون ٿا ته پوءِ اسان هاشميپ جي بدران صف پڻ استعمال ڪري سگهون ٿا. ڇو ته پوءِ اسان يقين ڪري سگهون ٿا ته (سيٽ + اين)> = 0 ۽ صف انڊيڪسنگ 0 کان شروع ٿي.

ڪوڊ

سي ++ پروگرام حل ڪندڙ آرري ليوٽ ڪوڊ جو مسئلو حل ڪرڻ ۾
#include <bits/stdc++.h> 
using namespace std; 
  
int subArray(int a[], int n){ 
    
    unordered_map<int, int> hM; 
  
    int sum = 0, max = 0, end = -1; 
  
    for(int i=0; i<n; i++) 
        a[i] = (a[i] == 0) ? -1 : 1; 
  
    for(int i=0; i<n; i++){ 
        sum += a[i]; 
  
        if(sum == 0){ 
            max = i + 1; 
            end = i; 
        } 
  
        if(hM.find(sum + n) != hM.end()){ 
            if(max < i - hM[sum + n]){ 
                max = i - hM[sum + n]; 
                end = i; 
            } 
        } 
        else 
            hM[sum + n] = i; 
    } 
  
    for(int i=0; i<n; i++) 
        a[i] = (a[i] == -1) ? 0 : 1; 
        
    if(end>-1)
        cout<<end - max + 1<<" to "<<end; 
    else
        cout<<"No such subarray";
    return max; 
} 
  
int main(){ 
    int a[] = {1, 0, 1, 1, 1, 0, 0}; 
    int n = sizeof(a) / sizeof(a[0]); 
  
    subArray(a, n); 
    return 0; 
} 
1 to 6
جاوا پروگرام لٽاريل آرري ليٽ ڪوڊ جو مسئلو حل ڪرڻ ۾
import java.util.HashMap;

class LongestSubArray{
    int subArray(int a[], int n){ 
        
        HashMap<Integer, Integer> hM = new HashMap<Integer, Integer>(); 
  
        int sum = 0, max = 0, end = -1, start = 0; 
  
        for(int i=0; i<n; i++){ 
            a[i]=(a[i]==0) ? -1 : 1; 
        } 
  
        for(int i=0; i<n; i++){ 
            sum += a[i]; 
  
            if(sum == 0){ 
                max = i + 1; 
                end = i; 
            } 
  
            if(hM.containsKey(sum + n)){ 
                if(max < i - hM.get(sum + n)){ 
                    max = i - hM.get(sum + n); 
                    end = i; 
                } 
            } 
            else 
                hM.put(sum + n, i); 
        } 
  
        for(int i=0; i<n; i++) { 
            a[i] = (a[i] == -1) ? 0 : 1; 
        } 
  
        int index = end - max + 1; 
        
        if(end>-1)
            System.out.println(index + " to " + end); 
        else
            System.out.println("No such subarray"); 
        return max;  
    } 
    public static void main(String[] args){ 
        LongestSubArray s = new LongestSubArray(); 
        int a[] = { 1, 0, 1, 1, 1, 0, 0 }; 
        int n = a.length; 
        
        s.subArray(a, n); 
    } 
}
1 to 6

پيچيدگي تجزيي

وقت جي پيچيدگي

اي (اين) جتي ڏنل ڏنل صف ۾ عناصر جو تعداد a []. اي ڪيو کان وٺي unordered_map / HashMap استعمال ڪيو ويو ، اسان O (N) وقت حاصل ڪرڻ جي قابل ٿي چڪا آهيون ڇاڪاڻ ته هشميپ O (1) وقت داخل ڪرڻ جي ڳولا ، حذف ڪرڻ جي اجازت ڏئي ٿو.

خلائي پيچيدگي

اي (اين) ڇاڪاڻ ته اسان اين اضافي جڳھ استعمال ڪئي. جتان اسان هڪ هش ايمپ اشتهار استعمال ڪيو آهي معلومات اين جي عنصرن کي محفوظ ڪيو آهي ، بدترين حالت ۾ جيڪا اين جا عنصر ٿي سگهن.