Dublikat II Leetcode həllini ehtiva edir

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Amazon Facebook google
alqoritmlər Geyim kodlaşdırma Hashing müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutions Sürüşmə pəncərəBaxılıb 37

Problem bəyanat

Bu problemdə bizə array tam ədəd və ən azı məsafədə olan hər hansı bir təkrar elementin olub olmadığını yoxlamalıyıq k bir-birinə.
yəni eyni iki elementin indeksləri arasındakı fərq k -ə bərabər olmalıdır.
Və ya,  nums [i] == nums [j] abs (ij) <= k

misal

nums = [1,2,3,1], k = 3
true

Explanation:

0 və 3 indeksindəki element eynidır və 3 - 0 <= k.

nums = [1,2,3,1,2,3], k = 2
false

Yanaşma 1 (kobud güc)

Kobud güc yanaşmasından danışırıqsa, sadəcə iki döngədən istifadə edərək proqramı həyata keçirə bilərik və hər hansı bir elementin olub-olmamasından asılı olaraq massivin hər bir elementini ondan k məsafəyə qədər yoxlaya bilərik.
Əgər hər hansı bir element cari elementlə eyni tapılarsa, onda true qaytarırıq, əks halda yalan qaytarırıq.

Alqoritm

  1. Hər element üçün bir döngü çalıştırın nums [i] verilmiş massivin.
  2. Bu döngənin içərisində yenidən for for formasını işə salın və bütün elementləri keçin j = i + 1 üçün j = i + k və dəyərini ilə müqayisə edin nums [i].
    • If nums [j] == nums [i] sonra doğru qayıt. Bir element tapdıqca.
  3. Nəhayət, heç bir kopiya elementi tapılmadıqda, funksiyadan çıxmadan əvvəl false əmrini qaytarın.

Dublikat II Leetcode həllini ehtiva edən tətbiq

C ++ Proqramı

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

bool containsNearbyDuplicate(vector<int>& nums, int k) 
{
    for(int i=0;i<nums.size();i++)
        for(int j=i+1;j<nums.size() && j<=i+k;j++)
        {
            if(nums[j]==nums[i])
                return true;
        }

    return false;
}

int main() 
{
    vector<int> nums={1,2,3,1};
    int k=3;
    if(containsNearbyDuplicate(nums, k))
        cout<<"true"<<endl;
    else
        cout<<"false"<<endl;

   return 0; 
}
true

Java Proqramı

class Rextester{
    
    public static boolean containsNearbyDuplicate(int[] nums, int k) 
    {
        for(int i=0;i<nums.length;i++)
            for(int j=i+1;j<nums.length && j<=i+k;j++)
            {
                if(nums[j]==nums[i])
                    return true;
            }

        return false;

    }
    
    public static void main(String args[])
    {
       	int[] nums={1,2,3,1};
        int k=3;
        System.out.println(containsNearbyDuplicate(nums,k) );
    }
}
true

Təkrarlanan II Leetcode həllini ehtiva edən mürəkkəblik analizi

Zamanın mürəkkəbliyi

O (n * min (k, n)): Dizinin hər bir elementi üçün min (k, n) element keçirik. Beləliklə, zaman mürəkkəbliyi O (n * min (k, n)) olacaqdır.

Kosmik Mürəkkəblik 

O (1): Daimi yer.

Yanaşma 2 (sürüşmə pəncərə)

Gördüyümüz kimi massivin zaman mürəkkəbliyini artıran elementlərinə birdən çox dəfə gedirik. Vaxtı O (n) -ə endirmək üçün hər elementə yalnız bir dəfə baş çəkməliyik.

Bunun üçün nə edə biləriksə, əvvəlki sürüşmə pəncərəni saxlaya bilərik k Hər dəfə bir sıra elementlərini ziyarət etdiyimiz zaman bir Hash Set istifadə edən elementlər. Bunu etməklə, əvvəlki k elementlərinin çoxluğundan çoxluqda ziyarət etdiyimiz cari elementlə eyni bir elementin olub olmadığını yoxlaya bilərik. Setdə birini tapmışdıqsa, o anda həqiqətə qayıdırıq. Əks təqdirdə cari elementi dəstə daxil edəcəyik və eyni zamanda son ziyarət edilən elementi daim olduğu kimi yığmadan çıxaracağıq k dəstimizdəki əvvəlki elementlər.

Aşağıdakı şəkildə bir nümunəyə baxaq:

Dublikat II Leetcode həllini ehtiva edirPin

Alqoritm

  1. Bir yaradın Hash Set saxlama üçün k əvvəlki elementlər.
  2. Bir döngədə verilmiş massivin hər bir ədədi [i] üçün keçid.
    • Qarışıq dəstində onsuz da [i] rəqəmləri olub-olmadığını yoxlayın. Çoxluqda [i] rəqəmləri varsa (yəni cüt element bərabərdən az məsafədə mövcuddursa) k ), sonra doğru qayıdın. Başqa bir sıra [i] ədədi əlavə edin.
    • Dəstin ölçüsü k-dan böyük olarsa, son ziyarət olunan elementi (nums [ik]) çoxluqdan silin.
  3. Nəhayət, heç bir kopiya elementi tapılmadıqda, funksiyadan çıxmadan əvvəl false əmrini qaytarın.

Dublikat II Leetcode həllini ehtiva edən tətbiq

C ++ Proqramı

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

bool containsNearbyDuplicate(vector<int>& nums, int k) 
{
    unordered_set<int> set;
    for(int i=0;i<nums.size();i++)
    {
        if(set.count(nums[i])) return true;
        set.insert(nums[i]);

        if(set.size()>k)
            set.erase(nums[i-k]);
    }

    return false;
}

int main() 
{
    vector<int> nums={1,2,3,1};
    int k=3;
    if(containsNearbyDuplicate(nums, k))
        cout<<"true"<<endl;
    else
        cout<<"false"<<endl;

   return 0; 
}
true

Java Proqramı

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

bool containsNearbyDuplicate(vector<int>& nums, int k) 
{
    unordered_set<int> set;
    for(int i=0;i<nums.size();i++)
    {
        if(set.count(nums[i])) return true;
        set.insert(nums[i]);

        if(set.size()>k)
            set.erase(nums[i-k]);
    }

    return false;
}

int main() 
{
    vector<int> nums={1,2,3,1};
    int k=3;
    if(containsNearbyDuplicate(nums, k))
        cout<<"true"<<endl;
    else
        cout<<"false"<<endl;

   return 0; 
}
true

Təkrarlanan II Leetcode həllini ehtiva edən mürəkkəblik analizi

Zamanın mürəkkəbliyi

O (n): Hər bir elementi yalnız bir dəfə ziyarət etdikdə və bir element əlavə edib bir elementin götürülməsini yalnız O (n) -ə endirilən qarışıq təyin olunmuş vaxt mürəkkəbliyində daimi vaxt tələb etdiyini düşünürük.

Kosmik Mürəkkəblik 

O (min (k, n)): K elementlərini xaş dəstində maksimum dərəcədə saxlayırıq. K> n olduqda çoxluqda yalnız n element maksimumda saxlanacaqdır.

Şərh yaz

Translate »
1