Sayış Primes Leetcode Solutions

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Amazon alma Capital One google microsoft
alqoritmlər kodlaşdırma Hashing müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutions RiyaziyyatBaxılıb 99

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.

Bu problemdə bizə bir N ədədi verilir, Məqsəd N-dən kiçik rəqəmlərin necə say olduğunu hesablamaqdır. Tam mənfi olmamaqla məhdudlaşır.

misal

7
3
10
4

Izahat

10-dan az saylar 2, 3, 5 və 7-dir. Beləliklə, say 4-dür.

Yanaşma (Brute Force)

Ümumi yanaşma N-dən az olan hər bir ədədi yoxlamaq və əsas olduqda nəticəni artırmaqdır. Məsələn, N = 10-u nəzərdən keçirək. İndi bu aralıqda neçə əsasın olduğunu tapmaq üçün 2 - N - 1 arasında bir yoxlama apara bilərik. Lakin, bu yanaşma bütün çeşiddə əsas yoxlamanı tələb edir, [2, N - 1].  Buna görə bu yavaşdır.

Bəzi optimallaşdırma edə bilərik:

  1. 2-dən başqa hər bir sadə nömrə tək bir tam ədəddir. Beləliklə, sonra 2, yalnız tək tam ədədi yoxlaya bilərik.
  2. Bir rəqəmin əsas olub olmadığını yoxlaya bilərik O (√N) alqoritmi yaxşılaşdırma vaxtı.

Bununla birlikdə, bu yazıda daha sonra müzakirə edilən daha yaxşı bir yanaşma var.

Alqoritm

  1. Sayı azdırsa 3, qayıt 0, 2 ən kiçik başlıq olduğundan
  2. 3-dən başlayaraq bütün nömrələri yoxlayan bir döngə aparın
  3. Sayı, N əsasdır, əgər:
    • Var 2 ilə əsas amillər N
  4. Sayı əsasdırsa, nəticəni artırın
  5. Nəticəni çap edin

Count Primes Leetcode Solutions-un tətbiqi

C ++ Proqramı

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

bool isPrime(int N)
{
    for(int i = 2 ; i * i <= N ; i++)
        if(N % i == 0)
            return false;
    return true;
}


int countPrimes(int N)
{
    if(N < 3)
        return 0;
    int cnt = 1;
    for(int i = 3 ; i < N ; i += 2)
        if(isPrime(i))
            cnt++;

    return cnt;
}


int main()
{
    int N = 10;
    cout << countPrimes(N) << '\n';
}

Java Proqramı

class count_primes
{
    static boolean isPrime(int N)
    {
        for(int i = 2 ; i * i <= N ; i++)
            if(N % i == 0)
                return false;

        return true;
    }

    static int countPrimes(int N)
    {
        if(N < 3)
            return 0;
        int cnt = 1;//since number is atleast 3, 2 is a prime less than N
        for(int i = 3 ; i < N ; i += 2)
            if(isPrime(i))
                cnt++;
        return cnt;
    }

    public static void main(String args[])
    {
        int N = 10;
        System.out.println(countPrimes(N));
    }
}

4

Count Primes Leetcode Solutions-un Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

Üçün bir döngə aparırıq N / 2 dəfə. Hər çekdə O (N / 2) mürəkkəblik müddəti (ortalama olaraq alınır N / 2) xərclənir. Beləliklə, bu alqoritmin zaman mürəkkəbliyi O (N√N).

Kosmik mürəkkəblik

O (1), Sabit dəyişənlər üçün yalnız sabit boşluq istifadə olunur.

Yanaşma (optimal metod)

Hər hansı bir əsas ədədi nəzərdən keçirək 5, onda əmindir ki, özündən başqa 5-in bütün çarpanları heç də əsas amillərdən biri kimi 5-ə sahib olduqları kimi heç vaxt başlı ola bilməzlər. Eynilə, N-dən az və daha böyük olan bütün nömrələri saxlaya bilərik 0

The Eratosthenlərin ələk zaman N-dən az əsasları tapmaq üçün qədim və səmərəli bir alqoritmdir N O (N) ayıracaq qədər kiçikdir yaddaşda yer. Bütün qeyri-adi rəqəmləri kompozit olaraq qeyd edərək təkrarən aradan qaldırır. Bütün kompozitlər işarələndikdən sonra işarələnməyən rəqəmlər əsasdır.

Ayrıca, bir boole saxlamalıyıq array yaddaş istifadəsini hesablayan hər hansı bir rəqəmin işarələnib işarələnmədiyini yoxlamaq. Yəni, bu bizim olduğumuz bir vəziyyətdir ticarət yaddaşı off vaxtında yaxşılaşdırın.

Sayış Primes Leetcode SolutionsPin

Alqoritm

  1. Mantı dizisini qoruyun baş ölçüsü bərabərdir N - 1
  2. baş [] kompozitləri işarələmək və sonunda əsasları yoxlamaq üçün istifadə olunur
  3. Hər bir tam ədədin başlanması doğru. Alqoritm qurulur saxta hər qeyri-adi sayına
  4. 2-dən başlayaraq tam ədədin birinci çoxluğuna qədər ardıcıl tam ədədlər dövrü işlədin N-dən az
    • Hər bir tam x üçün, əsas [x] həqiqətə bərabərdirsə, onun çoxluğunu kimi qeyd edin saxta
    • Buradakı hər bir ədədin çoxluğu başlayır x * x x-in bütün digər vurmalarının işarələnməməsi kimi.
  5. Sonda [2, N - 1] aralığında neçə rəqəmin olduğunu yoxlayın doğru baş cədvəldə
  6. Nəticəni çap edin

Count Primes Leetcode Solutions-un tətbiqi

C ++ Proqramı

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

int sieve(int N)
{
    if(N < 3)
        return 0;

    int cnt = 0;
    bool prime[N];
    for(int i = 2 ; i < N ; i++)
        prime[i] = true;

    for(int i = 2 ; i * i < N ; i++)
    {
        if(prime[i])
            for(int j = i * i ; j < N ; j += i)
                prime[j] = false;
    }

    for(int i = 2 ; i < N ; i++)
        if(prime[i])
            cnt++;

    return cnt;
}

int countPrimes(int N)
{
    if(N < 3)
        return 0;
    return sieve(N);
}


int main()
{
    int N = 10;
    cout << countPrimes(N) << '\n';
}

Java Proqramı

class count_primes
{
    static int sieve(int N)
    {
        if(N < 3)
            return 0;

        int cnt = 0;
        boolean[] prime= new boolean[N];
        for(int i = 2 ; i < N ; i++)
            prime[i] = true;

        for(int i = 2 ; i * i < N ; i++)
        {
            if(prime[i])
                for(int j = i * i ; j < N ; j += i)
                    prime[j] = false;
        }

        for(int i = 2 ; i < N ; i++)
            if(prime[i])
                cnt++;

        return cnt;
    }

    static int countPrimes(int N)
    {
        if(N < 3)
            return 0;
        return sieve(N);
    }

    public static void main(String args[])
    {
        int N = 10;
        System.out.println(countPrimes(N));
    }
}

4

Count Primes Leetcode Solutions-un Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

Alqoritmin mürəkkəbliyi O (Nlog (logN)). Bunu aşağıdakı kimi sübut etmək olar:

Hər bir tam say üçün X, bir müddət keçiririk Xeyr bütün qatlarını aradan qaldırmaq.

Beləliklə, cəmi sərf olunan vaxt: N / 2 + N / 3 + N / 5 + N / 7 + ……

N-ni ümumi qəbul etmək, T (N) = N (1/2 + 1/3 + 1/5 + 1/7 +…). Seriyanın cəmi (1/2 + 1/3 + 1/5 + 1/7 +…) kimi sübut edilə bilər giriş (logN).

Buna görə də, T (N) = Nlog (logN)

Kosmik mürəkkəblik

O (N), bir rəqəmin başlıca olub olmadığını saxlamaq üçün bir hash masa yaratdığımız üçün.

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