Çoxluq Element Leetcode Solution

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Amazon alma Atlassian Bloomberg Facebook GoDaddy google microsoft Kahin bölmə Snapchat Yahoo Zenefits
alqoritmlər kodlaşdırma Bölün və fəth edin Hashing müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 109

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Problem bəyanat

Bizə bir array tam ədədi. ⌊ ⌋ mərtəbə operatoru olduğu massivdə ⌊N / 2⌋ vaxtdan çox baş verən tam ədədi qaytarmalıyıq. Bu element çoxluq elementi adlanır. Qeyd edək ki, giriş massivi həmişə əksəriyyət elementini özündə cəmləşdirir.

misal

Array = {1 , 3 , 3 , 3}
3

Eksplanasiya: ⌊N / 2⌋ = 4/2 = 2. '3' ədədi massivdə 3 dəfə baş verir.

Array = {1 , 1 , 2}
1

Izahat: ⌊N / 2⌋ = ⌊3 / 2⌋ = 1. Və '1' massivdə 2 dəfə baş verir.

Yanaşma (Hashtable)

Dizidəki hər elementin tezliyini hash cədvəlində saxlaya bilərik. Daha sonra> ⌊N / 2⌋ tezlikli bir tam ədədi yoxlamaq asan olur.

Alqoritm

  1. Ədədlərin tezliyini massivdə saxlamaq üçün hash cədvəlini başladın: tezliyi
  2. Hər element üçün, i, massivdə:
    • Artım tezlik [i] və ya təyin et tezlik [i] = 0 cədvəldə yoxdursa
    •  If tezlik [i] > N / 2:
      • qayıt mən
  3. Qaytar -1 (tərtib səhvini qarşısını almaq üçün)
  4. Nəticəni çap edin

Çoxluq Element Leetcode Solution tətbiqetməsi

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;

int majorityElement(vector <int> &a)
{
    int majorityCount = ((int) a.size()) / 2;
    unordered_map <int , int> frequency;
    for(int &i : a)
    {
        if(++frequency[i] > majorityCount)
            return i;
    }
    return -1;
}

int main()
{
    vector <int> a = {1 , 1 , 2 , 2 , 1 , 2 , 2};
    cout << majorityElement(a) << '\n';
    return 0;
}

Java Proqramı

import java.util.*;

class majority_element
{
    public static void main(String args[])
    {
        int[] a = {1 , 1 , 2 , 2 , 1 , 2 , 2};
        System.out.println(majorityElement(a));
    }

    static int majorityElement(int[] a)
    {
        HashMap <Integer , Integer> frequency = new HashMap<>();
        for(int i = 0 ; i < a.length ; i++)
        {
            frequency.put(a[i] , frequency.getOrDefault(a[i] , 0) + 1);
            if(frequency.get(a[i]) > a.length / 2)
                return a[i];
        }
        return -1;
    }
}
2

Çoxluq Element Leetcode Solution-un Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (N) çoxluq elementini tapmaq üçün massivi bir dəfə keçdikdə. N = massivin ölçüsü.

Kosmik Mürəkkəblik

O (N) massivdəki fərqli elementlərin maksimum sayı ola bilər: N - ⌊N / 2⌋ əksəriyyət elementi ən azından tutduğu üçün ⌊N / 2⌋ indekslər. Buna görə kosmik mürəkkəblik xətti xarakter daşıyır.

Yanaşma (Boyer-Moore Səsvermə Alqoritmi)

Bu problem, element axınında əksəriyyət elementini necə tapa biləcəyimizə dair gözəl bir nümunədir. Boyer-Moore Səsvermə alqoritmi ardıcıllıqla ⌊N / 2⌋ yerləri çox tutan elementi tapmaq üçün istifadə olunur. Bu alqoritm a saxlayır namizəd və onun saymaq massivdə. Dizinin bir keçidini işləyirik namizəd = -1 və saymaq = 0. Əgər massivdəki hər hansı bir element namizəd, artırırıq saymaq. Əks təqdirdə, onu azaldırıq. Sayı sıfır olarsa, dəyişdiririk namizəd və qurun saymaq geri 0.

Fəaliyyətini başa düşmək üçün aşağıdakı nümunəni izləyin:

Çoxluq Element Leetcode SolutionPin

Bu alqoritm prosesi seçki kimi qəbul edir və əvvəlcə bir namizəd qərar verir. Ən çox səs alan çoxluq namizədidir. Yuxarıda göstərilən nümunədə, əvvəlcə 1 namizəd seçirik, lakin sıra içində 4 göstəricisinə çatdıqda, sayın = 0 olduğunu müşahidə edirik, yəni namizəd olmayan qədər çox namizəd gördük. Beləliklə, mövcud elementi namizəd olaraq seçirik və prosesi davam etdiririk. Biz olduğumuz üçün zəmanətli massivdə əksəriyyət elementinə sahib olmaq üçün qaldığımız son namizəd əksəriyyət elementi olacaqdır.

Alqoritm

  1. İki dəyişəni başlayın: namizəd CNT müvafiq təkrarlamalar üçün namizədin və onun tezliyinin saxlanılması
  2. İndi hər element üçün i massivdə:
    • If CNT sıfıra bərabərdir:
      • yeniləmə: namizəd = i
    • If i bərabərdir namizəd:
      • artım CNT: cnt ++
    • Başqa:
      • Azalma CNT: cnt -
  3. Qayıtmaq namizəd
  4. Nəticəni çap edin

Çoxluq Element Leetcode Solution tətbiqetməsi

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;

int majorityElement(vector <int> &a)
{
    int candidate = -1 , cnt = 0;
    for(int &i : a)
    {
        if(cnt == 0)
            candidate = i;
        cnt += (candidate == i) ? 1 : -1;
    }
    return candidate;
}

int main()
{
    vector <int> a = {1 , 1 , 2 , 2 , 1 , 2 , 2};
    cout << majorityElement(a) << '\n';
    return 0;
}

Java Proqramı

import java.util.*;

class majority_element
{
    public static void main(String args[])
    {
        int[] a = {1 , 1 , 2 , 2 , 1 , 2 , 2};
        System.out.println(majorityElement(a));
    }

    static int majorityElement(int[] a)
    {
        int candidate = -1 , cnt = 0;
        for(int i = 0 ; i < a.length ; i++)
        {
            if(cnt == 0)
                candidate = a[i];
            cnt += (candidate == a[i]) ? 1 : -1;
        }
        return candidate;
    }
}
2

Çoxluq Element Leetcode Solution-un Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (N) bütün massivi bir dəfə keçdikdə. Burada, N = massivin ölçüsü.

Kosmik Mürəkkəblik

O (1) daimi yaddaş məkanından istifadə etdiyimiz üçün.

Crack Sistemi Dizayn Müsahibələri
Translate »
1