Etibarlı Mükəmməl Kvadrat LeetCode Həlli

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Çiy kərpic Amazon Facebook google LinkedIn microsoftBaxılıb 19

Problem bəyanat

Etibarlı Mükəmməl Kvadrat LeetCode Həlli – Verilmiş a müsbət tam num, True if qaytaran funksiya yazın num mükəmməl kvadratdır, başqa yanlışdır.

İzlə: Etməyin kimi hər hansı daxili kitabxana funksiyasından istifadə edin sqrt.

Input: num = 16
Output: true

Izahat

Bizim həllimiz üçün bir sərhəd müəyyən edilmişdir. istənilən n ədədi üçün onun kvadrat kökü 1 ilə n arasında ola bilər, ona görə də cavabın 1-dən n-ə qədər olacağını bilirik.

Sadə yanaşma

1-dən n-ə qədər hər nömrəni yoxlayın. O(n) vaxtını alacaqdı.

Optimallaşdırılmış yanaşma

İdeya sadədir, biz sadəcə bütün cüt bölənləri tapırıq. 2-dən …-ə qədər təkrar edirik və bölən tapdıqda,
bölməyə çalışırıq num bununla bir daha.

Misal üçün:
giriş: ədəd = 180

2-dən başlayaraq təkrarlayın:
180%2==0 ?
bəli -> ədəd = 180/2 = 90

yenidən 2-yə bölə biləcəyimizi yoxlayın:
90%2==0 ?
bəli -> ədəd = 90/2 = 45

indi 45-dir.
say azaldığından, biz yenidən 2-dən başlayaraq təkrar etməliyik:

45%2==0 ?
yox -> təkrarlamağa davam edin

45%3==0 ?
bəli -> ədədlər = 45/3 = 15
bir daha bölək

15%3==0 ?
bəli -> ədədlər = 15/3 = 5
indi 5-dir.

num azaldı -> 2-dən başlayaraq yenidən təkrarlayın
5%2==0 ?
yox -> təkrarlamağa davam edin
5%3==0 ?
yox -> təkrarlamağa davam edin
5%4==0 ?
yox -> təkrarlamağa davam edin
5%5==0 ?
bəli -> ədədlər = 5/5 = 1
bir dəfə daha bölə biləcəyimizi yoxlayın:
1%5==0 ?
yox -> yalanı qaytarın

tətbiq etmək ikili axtarış axtarış fəzasında və problem O(log n) vaxtında həll edilə bilər.

Etibarlı Mükəmməl Kvadrat LeetCode HəlliPin

Kodu

Etibarlı Mükəmməl Kvadrat üçün C++ Kodu

class Solution {
public:
    bool isPerfectSquare(int num) {
        if (num < 0) return false;
        if (num == 0 || num == 1) return true;
        
        int i = 0;
        int j = num;
        
        while (i <= j) {
            long b = i + (j-i)/2;
            
            if (b*b == num)
                return true;
            else if (b*b < num)
                i = b+1;
            else
                j = b-1;
        }
        
        return false;
    }
};

Etibarlı Mükəmməl Meydan üçün Java Kodu

class Solution {
    public boolean isPerfectSquare(int num) {
        int low=1, high=num;
        while(low<=high) {
            long mid=(low+high)>>>1;
            if(mid*mid==num) return true;
            else if(mid*mid>num) high=(int)mid-1;
            else low=(int)mid+1;
        }
        return false;
    }
}

Etibarlı Mükəmməl Meydan üçün Python Kodu

class Solution:
    def isPerfectSquare(self, num: int) -> bool:
        left = 0
        right = num
        while left <= right:

            mid = (left+right)//2

            if mid*mid==num:
                return True
            elif mid*mid > num:
                right = mid - 1
            else:
                left = mid+1
        return False

Etibarlı Mükəmməl Kvadrat LeetCode Həlli üçün Mürəkkəblik Təhlili

Zamanın mürəkkəbliyi

İkili axtarışın vaxt mürəkkəbliyi: O(log n)

Kosmik Mürəkkəblik

İkili axtarışın fəza mürəkkəbliyi: O(1)

Referans: https://en.wikipedia.org/wiki/Perfect_square

Şərh yaz

Translate »