Alt cəmi Leetcode

Çətinlik səviyyəsi Mühit
alqoritmlər Geyim kodlaşdırma Dinamik proqramlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 36

Subset cəmi leetcode problemi bir array n ölçülü bir []. Dizinin iki alt dəstə bölünə biləcəyini yoxlayın ki, bir alt çoxluqların cəmi digər alt dəstə bərabər olsun. Mümkünsə “Bəli” yazdırın, başqa “Xeyr”.

misal

a[ ] = {2, 3, 5}
Yes

Explanation: Birinci və ikinci elementlərin cəmi üçüncü elementə bərabərdir. Beləliklə, verilən sıra iki alt qrupa bölünə bilər.

a[ ] = {1, 2, 4, 9}
No

Explanation: Dizini iki alt qrupa bölmək üçün bərabər cəmə sahib olması üçün mümkün birləşmə yoxdur.

Rekursiv metod

Alqoritm

1. n ölçülü bir [] bir sıra başlayın.
2. Massivdən keçin və verilmiş a [] massivindəki bütün elementlərin cəmini tapın. Cəmi mod 2-nin 0 olmadığını yoxlayın, yalnış qaytarın.
3. Yaratmaq funksiyası bir məcmuədə cəmi tam orijinal massivin cəminin yarısına bərabər olan hər hansı bir alt qrupun olub olmadığını yoxlayır.
4. Sonuncu elementi daxil edərək və son elementi xaric edərək bu funksiyanı təkrarən çağırın.
5. Cəmi sıfırsa, doğru qayıdın. Cəmi sıfır deyilsə və n sıfırsa, başqa birinə yalan qaytarın.

Subset Sum Leetcode üçün tətbiqetmə

Alt dəsti üçün C ++ kodu

#include <bits/stdc++.h> 
using namespace std; 
  
bool isEqualSum(int a[], int n, int sum){  
    if(sum == 0)  
        return true;  
    if(n == 0 && sum != 0)  
        return false;  
  
    if(a[n-1] > sum)  
       return isEqualSum(a, n-1, sum);  
  
    return isEqualSum(a, n-1, sum) ||  
        isEqualSum(a, n-1, sum-a[n-1]);  
}  
  
bool Partiion(int a[], int n){  
    int sum = 0;  
    for(int i=0; i<n; i++)  
    sum += a[i];  
  
    if(sum%2 != 0)  
        return false;  
  
    return isEqualSum (a, n, sum/2);  
}  
  
int main(){  
    int a[] = {2, 3, 5};  
    int n = sizeof(a)/sizeof(a[0]);  
    if(Partiion(a, n))  
        cout << "Yes";  
    else
        cout << "No";  
    return 0;  
}
Yes

Subset Sum üçün Java Kodu

import java.io.*; 
  
class equalSum{ 
    static boolean isEqualSum(int a[], int n, int sum){ 
        if(sum == 0) 
            return true; 
        if(n == 0 && sum != 0) 
            return false; 
  
        if(a[n-1] > sum) 
            return isEqualSum(a, n-1, sum); 
  
        return isEqualSum(a, n-1, sum) || 
               isEqualSum(a, n-1, sum-a[n-1]); 
    } 
  
    static boolean Partition (int a[], int n){ 
        int sum = 0; 
        for(int i = 0; i < n; i++) 
            sum += a[i]; 
  
        if (sum%2 != 0) 
            return false; 
  
        return isEqualSum(a, n, sum/2); 
    } 
  
    public static void main (String[] args){ 
  
        int a[] = {2, 3, 5}; 
        int n = a.length; 
        if(Partition(a, n) == true) 
            System.out.println("Yes"); 
        else
            System.out.println("No"); 
    } 
}
Yes

Subset Sum Leetcode üçün Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

Hər problem iki kiçik alt problemə bölündüyü üçün. Alqoritmin O (2) olmasıdırn) zaman mürəkkəbliyi, burada n verilən a [] massivindəki tam ədədin sayıdır.

Kosmik Mürəkkəblik

O (1), çünki daimi əlavə yer istifadə edirdik.

Dinamik Proqramlaşdırma Metodu

Alqoritm

1. n ölçülü bir [] massivi başladın.
2. Massivdən keçin və bütün elementlərin cəmini tapın. Cəmi mod 2-nin 0 olmadığını yoxlayın, yalnış qaytarın.
3. 2 ölçülü bir sıra yaradın.
4. İlk sətri doğru, hər sətrin ilk sütunu yalnış kimi yeniləyin.
5. Keçməyə başlayın və j-1-ə qədər orijinal massivin hər hansı alt hissəsinin cəmi i-yə bərabərdirsə, [] [] hissəsini doğru olaraq yeniləyin. Başqa yalan.
6. Son boole dəyərini qismən qaytarın.

Subset Sum Leetcode üçün tətbiqetmə

Alt Cəmi üçün C ++ kodu

#include <bits/stdc++.h> 
using namespace std; 
  
bool Partiion(int a[], int n){  
    int sum = 0; 
    int i, j; 

    for(i=0; i<n; i++) 
        sum += a[i]; 

    if(sum%2 != 0) 
        return false; 

    bool part[sum / 2 + 1][n + 1]; 

    for (i = 0; i <= n; i++) 
        part[0][i] = true; 

    for (i = 1; i <= sum/2; i++) 
        part[i][0] = false; 

    for(i=1; i<=sum/2; i++){ 
        for(j=1; j<=n; j++){ 
            part[i][j] = part[i][j-1]; 
            if(i >= a[j-1]) 
                part[i][j] = part[i][j] || 
                             part[i - a[j-1]][j-1]; 
        } 
    }
    return part[sum/2][n];   
}  
  
int main(){  
    int a[] = {2, 3, 5};  
    int n = sizeof(a)/sizeof(a[0]);  
    if(Partiion(a, n))  
        cout << "Yes";  
    else
        cout << "No";  
    return 0;  
}
Yes

Subset Sum üçün Java kodu

import java.io.*; 
  
class equalSum{ 
    static boolean Partition (int a[], int n){ 
        int sum = 0; 
        int i, j; 
  
        for(i=0; i<n; i++) 
            sum += a[i]; 
  
        if(sum%2 != 0) 
            return false; 
  
        boolean part[][]=new boolean[sum/2+1][n+1]; 
  
        for (i = 0; i <= n; i++) 
            part[0][i] = true; 
  
        for (i = 1; i <= sum/2; i++) 
            part[i][0] = false; 
  
        for(i=1; i<=sum/2; i++){ 
            for(j=1; j<=n; j++){ 
                part[i][j] = part[i][j-1]; 
                if(i >= a[j-1]) 
                    part[i][j] = part[i][j] || 
                                 part[i - a[j-1]][j-1]; 
            } 
        }
        return part[sum/2][n];  
    } 
  
    public static void main (String[] args){ 
  
        int a[] = {2, 3, 5}; 
        int n = a.length; 
        if(Partition(a, n) == true) 
            System.out.println("Yes"); 
        else
            System.out.println("No"); 
    } 
}
Yes

Subset Sum Leetcode üçün Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (cəmi * n) burada n - verilən a [] massivindəki tam ədədin sayı və cəmi verilmiş a [] massivindəki bütün elementlərin cəmidir.

Kosmik Mürəkkəblik

O (cəmi * n) cəmi * n əlavə yer istifadə etdiyimiz üçün.

References

Şərh yaz

Translate »