Arrayın K ilə bölünən cəmi olan cütlərə bölünməsi

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Amazon microsoft
Geyim SükutBaxılıb 24

C-nin K-yə bölünən cütlüyə bölünməsi, indi və sonra müxtəlif çimdiklərə verdiyi müsahibələrdə soruşulan bir problemdir. Məni tanıyanlar bu problemləri hekayəyə çevirmə vərdişimi bilir. Bu yazıda bu problemi nəzərdən keçirək.

Problemi anlamaq üçün vəziyyət

Bir pandemiyanın yayılması ilə birlikdə yoxsullara yardım və rahatlıq gətirmək üçün bir çox təşkilatımız var. Bu gün üçün biz bu yardım səylərinin koordinatoruyuq. Yemək çantaları toplamaq və “k” torbalara bölmək bizə həvalə edilmişdir. Hər ailədən aldığımız rasion bir sıra şəklində təmsil olunur. Daha yaxşı başa düşmək üçün. Daha aydın olmaq üçün bir nümunə sınaq nümunəsinə baxaq.

misal

Input:

5

A = [4,5,0, -2, -3,1]

Çıxış:

7

5-ə bölünən subrayların sayı:

[4,5,0,-2,-3,1],[5],[5,0],[5,0,-2,-3],[0],[0,-2,-3],[-2,-3]

Bu sıra hər ailədən aldığımız paket sayını təmsil edir. K paketləri ən yaxın yerə çatdırmaq üçün bitişik ev təsərrüfatları ilə birlikdə klublaşırıq. Daha asanlıqla, serialı alt cədvəllərə bölməyə çalışırıq məbləğ Problemi həll etməyin müxtəlif yollarını nəzərdən keçirə bilərik. Bununla birlikdə, bu yazıda, çox başa düşülə bilən ən asanını təqdim edirəm.

Arrayın K ilə bölünən cəmi cütlərə bölünməsi alqoritmi

  • Cəmi göstərilən indeksə qədər saxlayan bir sıra yaradacağıq
  • Sonra cəmi indeksə bölünəndə bu indeksə qədər tapdığımız qalığı tapırıq
  • Qalan 0-dan kiçiksə, k əlavə edirik
  • Hashmap qalığı və onun meydana gəlməsini açar dəyər cütləri kimi saxlayacaqdır
  • Bundan sonra hər qalan istifadə ilə yarada biləcəyimiz alt dəstlərin sayını tapacağıq
  • Cəmi = Cəmi + dəyəri * (dəyər-1) / 2

Prosesi göstərən şəkil ola bilər

Arrayın K ilə bölünən cəmi olan cütlərə bölünməsiPin
Problem təsvir edildi

İndi nə edəcəyimizi bildiyimizə görə kodu nəzərdən keçirək

Java kodu

class Solution 
{
    public int subarraysDivByK(int[] A, int k) 
    {
        if(A==null || A.length<1)
            return -1;
        int sum[]=new int[A.length+1];
        for(int i=1;i<sum.length;i++)
        {
            sum[i]=sum[i-1]+A[i-1];
        }
        HashMap<Integer,Integer>combos=new HashMap<Integer,Integer>();
        for(int i=0;i<sum.length;i++)
        {
            int cur=sum[i]%k;
            if(cur<0)
                cur=cur+k;
            if(!combos.containsKey(cur))
                combos.put(cur,1);
            else
                combos.put(cur,combos.get(cur)+1);
        }
        System.out.println(combos);
        int ans=0;
        for(int i:combos.values())
        {
            ans+=i*(i-1)/2;
        }
        return ans;
    }
}

C ++ kodu

class Solution 
{
public:
    int subarraysDivByK(vector<int>& A, int k) 
    {
     if(A.size()<1)
            return -1;
        int sum[A.size()+1];
        for(int i=1;i<A.size()+1;i++)
        {
            sum[i]=sum[i-1]+A[i-1];
        }
        unordered_map<int,int>combos;
        for(int i=0;i<A.size()+1;i++)
        {
            int cur=sum[i]%k;
            if(cur<0)
                cur=cur+k;
            combos[cur]+=1;
        }
        int ans=0;
        for(auto i:combos)
        {
            ans+=(i.second)*(i.second-1)/2;
        }
        return ans;    
    }
};
5
{4, 5, 0, -2, -3, 1}
7

Arrayın K ilə bölünən cəmi olan cütlərə bölünməsi üçün mürəkkəblik analizi

Bu həlldə problemin zaman mürəkkəbliyi və kosmik mürəkkəbliyi sıralana bilər

Zaman Mürəkkəbliyi = O (n)

Kosmik Mürəkkəblik = O (n)

Necə?

Əvvəlcə Kosmik Mürəkkəblik

  • N girişlərindən ibarət olan HashMap bütün dəyərlərə malikdir
  • Bu xəritə yanımızda olan qalıqların sayı qədər böyükdür
  • Nəticə olaraq, bu kosmik mürəkkəbliyi O (n) -ə aparır

İkincisi, vaxtın mürəkkəbliyi

  • Həlldə üç döngə işlədirik
  • Əvvəlcə cəmi tapmaq üçün döngə = O (n)
  • İkincisi, qalığı tapmaq üçün bir döngü = O (n)
  • Üçüncüsü bütün birləşməni tapmaq = O (qalıqlar)
  • Nəticə etibarı ilə bütün bunlar O (n) zaman mürəkkəbliyinə səbəb olur

References

Translate »