Bitişik Array Leetcode

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon Facebook google
alqoritmlər Geyim kodlaşdırma Hashing müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 31

Problem bəyanat

“Bitişik Array Leetcode” problemi sizə verildiyini bildirir array n ölçülü a [] yalnız 1 və 0-dan ibarətdir. Tapın ən uzun subarray burada 1-lərin sayı 0-lara bərabərdir.

misal

Bitişik Array LeetcodePin

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

İzahat: 1-dən 6-ya qədər bir subarray seçib 6-cı uzunluğun ən yaxşı nəticəsini veririk. 1-dən 6-a qədər olan bitişik massivin 3-ü və 3-ü var. Burada 0 əsaslı indeksləşdirmə hesab etdik.

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

Yanaşma

Sadəlövh metod

Mümkün olan bütün alt analizləri yaradın. 1-in sayının 0-ın sayına bərabər olan hər hansı bir alt bölməsinin olub olmadığını yoxlayın. Alt dizinin sol və sağ sərhədləri üçün iki i və j göstəricilərindən istifadə edirik. Sonra 0-ı -0 ilə əvəz etdikdən sonra, i-dən j-yə qədər subarray cəminin cəmi = 1 olub olmadığını yoxlayırıq. Əgər bu doğrudursa, şərtlərə cavab verən alt bölmə tapdıq. İndi cavabımızı yeniləyirik.

Bitişik sıra leetcod problemi üçün alqoritm

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.

Kodu

Bitişik Array Leetcode problemini həll etmək üçün C ++ proqramı
#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
Bitişik Array Leetcode problemini həll etmək üçün Java Proqramı
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

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

Buradan bəri bir göstəricini sabit saxlayarkən sıra boyunca gəzirdik. -Nin bir polinom zaman mürəkkəbliyinə nail olduq  O (N2) burada n - verilən bir [] massivindəki elementlərin sayı.

Kosmik Mürəkkəblik

O (1) çünki daimi əlavə yer istifadə edirdik. Yalnız dəyişənlərin daimi sayını yaratdıq. Lakin ilkin giriş massivindən başqa heç bir sıra istifadə etməyib. Ancaq proqram bütövlükdə giriş elementlərini saxlamaq üçün bir sıra istifadə etdiyimiz üçün O (N) kosmik mürəkkəbliyə malikdir.

Hash xəritəsi istifadə olunur

Bitişik sıra leetcod problemi üçün alqoritm

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".

Burada etdiklərimiz, sadəcə cəmi 0 olan ən böyük alt bölməni tapmaq lazım olduqda. Nə edirsək, cəmi prefiksini götürürük və eyni cəmi tapa biləcəyimiz bir yer varsa xəritəmizə daxil oluruq. Sonra +1 xəritədə saxlanılan dəyərdən indiki indeksə qədər olan subarray cəmi 0-a bərabərdir. Burada (sum + n) düyməsini istifadə edirik. Ancaq biz birbaşa cəmdən də istifadə edə bilərdik. Lakin (sum + n) düyməsini açar kimi istifadə etsək, HashMap əvəzinə bir sıra da istifadə edə bilərik. Çünki onda (sum + n)> = 0 və sıra indeksləşdirməsinin 0-dan başlayacağına əmin ola bilərik.

Kodu

Bitişik Array Leetcode problemini həll etmək üçün C ++ proqramı
#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
Bitişik Array Leetcode problemini həll etmək üçün Java Proqramı
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

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

O (N) burada n - verilən bir [] massivindəki elementlərin sayı. E unordered_map / HashMap istifadə etdiyindən, O (N) vaxt əldə edə bildik, çünki HashMap O (1) -ə daxiletmə axtarışını, silməsini həyata keçirməyə imkan verir.

Kosmik Mürəkkəblik

O (N) çünki N əlavə yer istifadə etdik. Bir HashMap reklamından istifadə etdiyimiz üçün N elementi haqqında məlumatları, ən pis halda N elementi ola bilər.

Şərh yaz

Translate »