Vurma Cədvəli Leetcode Həllində K-ci Ən Kiçik Rəqəm

Çətinlik səviyyəsi Ağır
Tez-tez soruşulur Amazon google bölməBaxılıb 20

Problem bəyanat

The Vurma Cədvəli Həllində K-ci Ən Kiçik Ədəd – sizə mxn ölçülü vurma cədvəli matrisinin verildiyini bildirir, burada matrisa[i][j] = i*j (1 indeksli).

Verilmiş üç tam m, n və k üçün biz tapmaq lazımdır k-ci ən kiçik element mxn vurma cədvəlində.

Misal:

Vurma Cədvəli Leetcode Həllində K-ci Ən Kiçik RəqəmPin

 

Input: m = 3, n = 3, k = 5
Output: 3

Explanation:

  • Sıralanmış formada 3 x 3 vurma cədvəlinin elementləri bunlardır: [1, 2, 2, 3, 3, 4, 6, 6, 9].
  • 5th ən kiçik rəqəm 3-dir.

 

Input: m = 2, n = 3, k = 6
Output: 6

Explanation:

  • Sıralanmış formada 2 x 3 vurma cədvəlinin elementləri bunlardır: [1, 2, 2, 3, 4, 6].
  • The kth ən kiçik sayı: 6

Yanaşma

Idea:

  1. Bu problemi səmərəli həll etmək üçün əsas ideyadır İkili Axtarış.
  2. İkili axtarış üçün aşağı həddi (l) olan matrisin minimum elementi kimi qəbul edin matris[0][0].
  3. Və, ikili axtarış üçün yuxarı həddi (r) matrisin maksimum elementi kimi qəbul edin. matris[m][n].
  4. İndi vurma cədvəlindəki k-ci ən kiçik ədəd [l,r] diapazonunda k-1 olan ən kiçik ədədə bərabərdir. kiçik elementlər özündən daha çox.
  5. Biz Binary Search həyata keçirə bilərik. Cari mövqe orta üçün, edək CNT matrisin ortasından kiçik olan elementlərin sayını bildirir.
    • If cnt< k, k-dan azdır az və ya bərabər olan ədədlər cədvəlin ortasına qədər. Beləliklə, orta və ya ondan aşağı olan hər hansı tam ədəd bizim cavabımız ola bilməz. Beləliklə, ortadan aşağı axtarış sahəsini edərək ortadan qaldırın l = orta + 1.
    • If cnt >= k, cədvəldə ortadan kiçik və ya ona bərabər olan ən azı k ədəd (bəlkə də daha çox) var. Beləliklə, orta mümkün etibarlı həlldir. Amma cnt >= k kimi ortadan da kiçik ədəd ola bilər. Beləliklə, mümkün cavab olaraq orta işarələyin və r = orta - 1 edin.
    • Nəhayət, tələb olunan k-ci cavabı qaytarırıq ən kiçik element cədvəldə.
  6. İndi ortadan daha kiçik elementləri tapmaq üçün bütün sətirləri təkrarlamalıyıq. Cavabımız ortanın bölünməsi nəticəsində əldə edilən mərtəbə dəyəri ilə artırılacaq sıra nömrəsi hər sıra üçün. Nəzərə alın ki, hər bir sətir üçün alınan dəyər ən çox n (matrisanın sütunlarının sayı) olmalıdır.

Nümunə Girişi 1 üçün İzahlı Quru Qaçış:

Vurma Cədvəli Leetcode Həllində K-ci Ən Kiçik RəqəmPin

Vurma Cədvəli Leetcode Həllində K-ci Ən Kiçik RəqəmPin

Vurma Cədvəli Leetcode Həllində K-ci Ən Kiçik RəqəmPin

Kodu

Vurma Cədvəlindəki K-ci Ən Kiçik Rəqəm Leetcode C++ Həlli:

class Solution {
public:
    int findKthNumber(int m, int n, int k) {
        int l = 1,r = m*n,ans = r;
        while(l<=r){
            int mid = (l+r)/2,cnt = 0;
            for(int i=1;i<=m;i++){
                cnt += min(n,mid/i);
            }
            if(cnt>=k){
                ans = mid;
                r = mid - 1;
            }
            else{
                l = mid + 1;
            }
        }
        return ans;
    }
};

Vurma Cədvəlindəki K-ci Ən Kiçik Rəqəm Leetcode Java Həlli:

class Solution {
    public int findKthNumber(int m, int n, int k) {
        int l = 1,r = m*n,ans = r;
        while(l<=r){
            int mid = (l+r)/2,cnt = 0;
            for(int i=1;i<=m;i++){
                cnt += Math.min(n,mid/i);
            }
            if(cnt>=k){
                ans = mid;
                r = mid - 1;
            }
            else{
                l = mid + 1;
            }
        }
        return ans;
    }
}

Vurma Cədvəli Leetcode Həllində K-ci Ən Kiçik Say üçün Mürəkkəblik Təhlili

Zamanın mürəkkəbliyi

Yuxarıdakı kodun zaman mürəkkəbliyi O(m*log(m*n)), burada m = matrisin sətirlərinin sayı və n = matrisin sütunlarının sayı.

Nəzərə alın ki, hər dəfə axtarış sahəsi ikili axtarış səbəbindən yarıya endikdə log(m*n) faktoru gəlir. Və hər dəfə, biz tam olaraq m dəfə təkrarlamalıyıq. Beləliklə, O(m*log(m*n)).

Kosmik Mürəkkəblik

Yuxarıdakı kodun kosmik mürəkkəbliyi O (1) çünki biz daimi əlavə yerdən istifadə edirik.

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

Şərh yaz

Translate »