Döndürülmüş Sıralanmış Array Leetcode həllində axtarın

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Çiy kərpic Əlibaba Amazon alma Bloomberg ByteDance Cisco eBay Expedia Facebook Goldman Sachs google JPMorgan LinkedIn microsoft Nutanix Nvidia Kahin PayPal Paytm Salesforce Samsung XidmətNow Tencent Tesla TripAdvisor Twitch Über Viza VMware Walmart Laboratoriyaları Yahoo Yandex Zillow Zulily
alqoritmlər Geyim İkili axtarış kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 43

Sıralanmış bir massivi nəzərdən keçirin, ancaq bir indeks seçildi və massiv həmin nöqtədə döndü. İndi sıra döndərildikdən sonra müəyyən bir hədəf elementini tapmalı və indeksini qaytarmalısınız. Hər halda, element mövcud deyil, -1 qaytarın. Problem ümumiyyətlə Döndürülmüş Sıralanmış Array Leetcode Solution-da Axtarış adlanır. Beləliklə, sualda, bizə məlum olmayan bir indeksdə sıralanan və döndürülən bəzi tam element elementlərindən ibarət bir sıra təmin olunur. Massivlə yanaşı, tapmalı olduğumuz müəyyən bir element də verilir.

Döndürülmüş Sıralanmış Array Leetcode həllində axtarınPin

array: [4,5,6,7,0,1,2]
target: 4
0

İzahat: Axtarılan element 4 olduğu üçün element 0 indeksində tapılıb, hədəfin indeksini qaytarırıq.

array: [4,5,6,7,0,1,2]
target: 3
-1

İzahat: Element massivdə olmadığı üçün -1-ə qayıdırıq.

Döndürülmüş Sıralanmış Arrayda Axtarış üçün Gücün Güc Yanaşması

Problem "Döndürülmüş Sıralanmış Arrayda Axtar", verilən dönmüş sıralanmış massivdə hədəf elementinin indeksini tapmağımızı xahiş edir. Və dönmüş bir sıralanmış massivin nə olduğunu artıq müzakirə etdik? Beləliklə, düşünə biləcəyiniz ən sadə metod Xətti Axtarışı sınamaqdır. Xətti axtarışda sadəcə verilənləri keçirik array və cari elementin hədəf elementimiz olub olmadığını yoxlayın. Mövcud element hədəf elementdirsə, indiki indeksə qayıdırıq, əks halda -1 qaytarırıq. Yanaşma çox sadədir, lakin dizinin sıralanaraq tək bir indeksdə döndərilməsindən istifadə etmədiyi üçün. Bu yanaşma xətti zaman mürəkkəbliyinə malikdir.

Döndürülmüş Sıralanmış Array Leetcode həllində axtarış kodu

C ++ kodu

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

int search(vector<int>& nums, int target) {
    int n = nums.size();
    for(int i=0;i<n;i++)
        if(nums[i] == target)
            return i;
    return -1;
}

int main(){
    vector<int> nums({4,5,6,7,0,1,2});
    cout<<search(nums, 4);
}
0

Java kodu

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static int search(int[] nums, int target) {
        int n = nums.length;
        for(int i=0;i<n;i++)
            if(nums[i] == target)
                return i;
        return -1;
    }
    
    public static void main(String[] args){
    	int nums[] = {4,5,6,7,0,1,2};
    	System.out.println(search(nums, 4));
    }
}
0

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

O (N), çünki ən pis halda hədəf element massivin sonunda mövcud ola bilər. Beləliklə, zamanın mürəkkəbliyi doğrudur.

Kosmik Mürəkkəblik

O (1), hər bir elementlə əlaqəli olaraq hər hansı bir məlumat vermədiyimizdən və dəyişkən dəyişkənlərdən istifadə etdiyimizdən. Beləliklə kosmik mürəkkəblik sabitdir.

Döndürülmüş Sıralanmış Arrayda axtarış üçün optimal yanaşma

Daha əvvəl göstərilən yanaşma, dizinin dönmüş bir sıralanmış bir sıra olması faktından istifadə etmədi. Beləliklə, bu yanaşmada zamanın mürəkkəbliyini azaltmaq üçün bu həqiqətdən istifadə etməyə çalışırıq. Fikir verin, sıralanmış bir sıra olsaydı, sadəcə istifadə edərdik ikili axtarış lakin bu biraz çətin olsa. Burada ayrıca ikili axtarışdan istifadə etməyimiz tələb olunur. Ancaq ikili axtarışdan istifadə etsək, serialın orta elementində olduqdan sonra massivin hansı hissəsini seçəcəyini necə öyrənə bilərik? Çünki döndülmüş sıralanmış bir sıra olduğundan orijinal ikili axtarış alqoritmini sadəcə izləyə bilmərik. Beləliklə, normal ikili axtarışda kiçik bir dəyişiklik var.

Beləliklə, ümumiyyətlə ikili axtarışda, cari elementin (orta indeksdəki element) hədəflə eyni olub olmadığını yoxlayırıq, sonra indeksini qaytarırıq. Bu addım burada qalır. Bunun xaricində, eyni deyilsə, pivotun cari elementin sağında və ya solda olub olmadığını yoxlayırıq. Sağa doğru uzanırsa, hədəfin dönməmiş alt sətirdə olub olmadığını yoxlayırıq, yoxsa yüksək səviyyəni yeniləyiriksə. Eynilə, pivot sola uzanırsa, yenə də hədəfin dönməmiş alt sətirdə olub olmadığını yoxlayırıq, aşağı, daha yüksək olanı yeniləyirik. Və sonunda, döngədən çıxsaq, hədəfin verilmiş massivdə olmadığına əminik.

Döndürülmüş Sıralanmış Array Leetcode həllində axtarış üçün optimize edilmiş kod

C ++ kodu

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

int search(vector<int>& nums, int target) {
    int n = nums.size();
    int low = 0, high = n-1;
    while(low<=high){
        int mid = (low+high)/2;
        // check if the current element is target
        if(nums[mid] == target)
            return mid;
        // if the starting index of the search space has smaller element than current element
        else if(nums[low]<=nums[mid]){
            // if target lies in non-rotated search space (or subarray)
            if(target >= nums[low] && target < nums[mid])
                high = mid - 1;
            else
                low = mid + 1;
        } else {
            // if target lies in non-rotated subarray
            if(target>nums[mid] && target<=nums[high])
                low = mid + 1;
            else
                high = mid - 1;
        }
    }
    // if you couldn't find the target element until now then it does not exists
    return -1;
}
int main(){
    vector<int> nums({4,5,6,7,0,1,2});
    cout<<search(nums, 4);
}
0

Java kodu

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static int search(int[] nums, int target) {
        int n = nums.length;
        int low = 0, high = n-1;
        while(low<=high){
            int mid = (low+high)/2;
            // check if the current element is target
            if(nums[mid] == target)
                return mid;
            // if the starting index of the search space has smaller element than current element
            else if(nums[low]<=nums[mid]){
                // if target lies in non-rotated search space (or subarray)
                if(target >= nums[low] && target < nums[mid])
                    high = mid - 1;
                else
                    low = mid + 1;
            } else {
                // if target lies in non-rotated subarray
                if(target>nums[mid] && target<=nums[high])
                    low = mid + 1;
                else
                    high = mid - 1;
            }
        }
        // if you couldn't find the target element until now then it does not exists
        return -1;
    }
    
    public static void main(String[] args){
    	int nums[] = {4,5,6,7,0,1,2};
    	System.out.println(search(nums, 4));
    }
}
0

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

O (log N), hədəf elementini tapmaq üçün ikili axtarışdan istifadə etdiyimiz üçün. Zamanın mürəkkəbliyi loqaritmikdir.

Kosmik Mürəkkəblik

O (1), yalnız bəzi sabit sayda element saxladığımızdan, kosmik mürəkkəblik sabitdir.

Şərh yaz

Translate »