Bir sıra Leetcode həllində itən bütün nömrələri tapın

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Çiy kərpic Amazon alma Bloomberg google microsoft Yahoo
alqoritmlər Geyim kodlaşdırma Hashing müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 43

Problem bəyanat

Bu problemdə bizə bir array tam ədədi. 1-dən N-ə qədər olan elementləri ehtiva edir, burada N = massivin ölçüsü. Bununla birlikdə, yoxa çıxan bəzi elementlər var və yerlərində bəzi dublikatlar mövcuddur. Məqsədimiz bu cür itən tam ədədlərin bir sıra qayıtmaqdır.

misal

Array = {1 , 2 , 5 , 6 , 2 , 5}
3 4

Bir sıra Leetcode həllində itən bütün nömrələri tapınPin

Array = {1 , 2 , 3 , 4}
n

Bir sıra Leetcode həllində itən bütün nömrələri tapınPin

Yanaşma (HashSet istifadə edərək)

Dizidəki hər elementi qeyd edib aralıqda döngə edə bilərik: [1, N] massivdə hansı elementlərin itdiyini və ya itkin olduğunu yoxlamaq üçün. Bir tamın işarələnib işarələnməməsini saxlamaq üçün bir hash setindən istifadə edirik.

Alqoritm

  1. Bir hash dəsti başladın işarəsi [Tamsayı] mövcud olan elementləri saxlamaq.
  2. Hər element üçün i massivdə:
    • əlavə etmək i üçün qeyd
  3. Siyahını / vektorunu başladın nəticələnəcək itkin elementləri massivdə saxlamaq
  4. Hər element üçün aralığında: [1, N]:
    • If mövcud deyil işarəsi:
      • Əlavə edin nəticələnəcək
  5. Qayıtmaq nəticələnəcək
  6. Nəticəni çap edin

Bir sıra Leetcode həllində itkin düşən bütün nömrələri tapmaq tətbiqidir

C ++ Proqramı

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

vector <int> findDisappearedNumbers(vector <int> &a)
{
    unordered_set <int> mark;
    for(int &i : a)
        mark.insert(i);
    int N = a.size();
    vector <int> result;
    for(int i = 1 ; i <= N ; i++)
        if(mark.find(i) == mark.end())
            result.emplace_back(i);

    return result;
}

int main()
{
    vector <int> a = {1 , 2 , 5 , 6 , 2 , 5};
    vector <int> result = findDisappearedNumbers(a);
    if(result.empty())
        cout << "No disappeared elements\n";
    else
        for(int &i : result)
            cout << i << " ";
    return 0;
}

Java Proqramı

import java.util.*;

class find_disappeared_numbers
{
    public static void main(String args[])
    {
        int[] a = {1 , 2 , 5 , 6 , 2 , 5};
        List <Integer> result = findDisappearedNumbers(a);
        if(result.size() == 0)
            System.out.println("No disappeared elements");
        else
            for(int i : result)
                System.out.print(i + " ");
    }

    static List <Integer> findDisappearedNumbers(int[] a)
    {
        List <Integer> result = new ArrayList <Integer>();
        HashSet <Integer> mark = new HashSet <Integer>();
        for(int i : a)
            mark.add(i);

        for(int i = 1 ; i <= a.length ; i++)
            if(!mark.contains(i))
                result.add(i);

        return result;
    }
}
3 4

Bir sıra Leetcode həllində yoxa çıxan bütün nömrələri tapın

Zamanın mürəkkəbliyi

O (N) tam ədədləri qeyd etmək üçün bütün massivi bir dəfə keçdikdə. N = massivin ölçüsü.

Kosmik Mürəkkəblik 

O (N) massivdə mövcud olan bütün rəqəmləri hash cədvəlində saxladığımız üçün. Diqqət yetirin ki, çıxan massivi kosmik mürəkkəblik qatqısı hesab etmirik.

Yanaşma (yerində dəyişiklik)

Bu problemdə diqqət çəkən bir məqam budur: “massiv həmişə ölçüsündən kiçik və ya bərabər elementlər ehtiva edir”. Bu, fərqli elementlər qədər indekslərin olduğu deməkdir. Ayrıca, itkin elementlər həmişə N-dən (massivin ölçüsü) az olacaqdır. Bu məhdudiyyəti istifadə edərək, bir ədədin varlığını bir şəkildə saxlamaq üçün serialın özündən istifadə edə bilərik. Məsələn, yaza biləcəyimizi düşünək doğru yalan elementin indeksində müvafiq olaraq varlığını / yoxluğunu bildirmək üçün. Bizim vəziyyətimizdə, massiv onsuz da elementləri ehtiva edir, buna görə də bu cür saxlama / yadda saxlamaq mümkün görünmür. Lakin bütün elementlərin müsbət olduğunu bildiyimiz üçün “mənfi” dən massivdə bir element görüb görməməyimizin işarəsi kimi istifadə edə bilərik. Qeyd edək ki, bəzi indekslərdə saxlanan həqiqi dəyəri istifadə edərək əldə edə bilərik mütləq () bir tam ədədin mütləq dəyərini qaytaran funksiya. Bu şəkildə serial həm hash xəritəsi, həm də konteyner kimi istifadə edilə bilər.

Məsələn, massivdə '2' elementi görmüşüksə, 1-ci elementin massivdə göründüyünü izah edəcək Array [1] = -1 * Array [2] təyin edə bilərik.

Bu hiylə indeksdə bir element görmüşüksə, saxlamaq üçün yerdəki massivi idarə edəcəkdir i. Tamamlandıqdan sonra mənfi olmayan (görünmədiyi mənasını verən) bütün tam ədədləri tapmaq üçün [1, N] aralığında bir döngə keçirə bilərik və lazım olan nəticəni çap edə bilərik. Qeyd edək ki, bu yalnız biz olduğumuz halda mümkündür icazə massivi dəyişdirmək.

Alqoritm

  1. Hər element üçün massivdə:
    • Array [i - 1]> 0 olarsa:
      • Bunu mənfi, ya da Array [i - 1] * = -1;
  2. Siyahını / vektorunu başladın nəticələnəcək bütün itkin elementləri saxlamaq üçün
  3. Hər tam ədəd üçün [1, N] aralığında (N = massivin ölçüsü):
    • If Array [i]> 0
      • Bu elementi əlavə edin i üçün nəticələnəcək
  4. Qayıtmaq nəticələnəcək
  5. Nəticəni çap edin

Bir sıra Leetcode həllində itkin düşən bütün nömrələri tapmaq tətbiqidir

C ++ Proqramı

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

vector <int> findDisappearedNumbers(vector <int> &a)
{
    int N = a.size();
    int idx;
    for(int i = 0 ; i < N ; i++)
    {
        idx = abs(a[i]) - 1;
        if(a[idx] > 0)
            a[idx] *= -1;
    }

    vector <int> result;
    for(int i = 0 ; i < N ; i++)
        if(a[i] > 0)
            result.emplace_back(i + 1);

    return result;
}

int main()
{
    vector <int> a = {1 , 2 , 5 , 6 , 2 , 5};
    vector <int> result = findDisappearedNumbers(a);
    if(result.empty())
        cout << "No disappeared elements\n";
    else
        for(int &i : result)
            cout << i << " ";
    return 0;
}

Java Proqramı

import java.util.*;
import java.lang.Math;

class find_disappeared_numbers
{
    public static void main(String args[])
    {
        int[] a = {1 , 2 , 5 , 6 , 2 , 5};
        List <Integer> result = findDisappearedNumbers(a);
        if(result.size() == 0)
            System.out.println("No disappeared elements");
        else
            for(int i : result)
                System.out.print(i + " ");
    }

    static List <Integer> findDisappearedNumbers(int[] a)
    {
        int idx;
        for(int i = 0 ; i < a.length ; i++)
        {
            idx = Math.abs(a[i]) - 1;
            if(a[idx] > 0)
                a[idx] *= -1;
        }

        List <Integer> result = new ArrayList <Integer> ();

        for(int i = 0 ; i < a.length ; i++)
            if(a[i] > 0)
                result.add(i + 1);

        return result;
    }
}
3 4

Bir sıra Leetcode həllində yoxa çıxan bütün nömrələri tapın

Zamanın mürəkkəbliyi

O (N) itkin elementləri tapmaq üçün girişdən asılı olmayaraq massivin iki keçidini işlədirik. N = massivin ölçüsü.

Kosmik Mürəkkəblik 

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

Şərh yaz

Translate »
1