İki çeşidlənmiş massivin K-ci ən kiçik məhsulu LeetCode Həlli

Çətinlik səviyyəsi Ağır
Tez-tez soruşulur Amazon LinkedInBaxılıb 18

Problem bəyanat

İki çeşidlənmiş massivin K-ci ən kiçik məhsulu LeetCode Həlli – İki verilmişdir sıralanmış 0 indeksli tam massivlər nums1 və nums2 həm də tam ədəd k, qayıt bu kth (1 əsaslı) ən kiçik məhsulu nums1[i] * nums2[j] hara 0 <= i < nums1.length və 0 <= j < nums2.length.

Input: nums1 = [2,5], nums2 = [3,4], k = 2
Output: 8
Explanation: The 2 smallest products are:
- nums1[0] * nums2[0] = 2 * 3 = 6
- nums1[0] * nums2[1] = 2 * 4 = 8
The

2-ci ən kiçik

 product is 8.

Izahat

Intuisiya

  • İki massiv üçün indeks cütünü a-da qoya bilərəm prioritet növbə və cavabı tədricən hesablayın. Bununla belə, K 10^9-a qədər ola bilər. Bu, TLE-yə səbəb olacaq.
  • Element mənfi ola bilər. Bəlkə də bilməliyəm mənfi elementlərin və tutacaqların sayı 4 müxtəlif kombinasiya: (mənfi massiv 1, mənfi massiv 2), (mənfi massiv 1, müsbət massiv 2), (müsbət massiv 1, mənfi massiv 2), (müsbət massiv 1, müsbət massiv 2). Ən azı, hər kombinasiyanın məhsullarının sayını bilə və onların arasında k-ci məhsulu tapa bilərəm.
  • K-ci məhsulun hansı kombinasiyaya aid olduğunu bilsəm də, bu, prioritet növbə yanaşmasından istifadə edə biləcəyimə zəmanət vermir. Mənə başqa ipucu lazımdır.
  • Yuxarıdakılara davam edərək, düşünürəm ki, məqsədə çatmaq üçün bir sıra məhsulları addım-addım aradan qaldırmaq üçün bir yol lazımdır.
  • Bu ildən massiv sıralanır, əgər diqqətimi 1[i] x ədədlər2[j] üzərinə yönəltsəm, 1[i] ədədləri tərəfindən yaradılan 1[i] x ədədlər2[j] ədədindən kiçik və ya bərabər olan j + 1 məhsul olduğunu bilə bilərəm. . Sonra başa düşürəm ki, ikili axtarışı sınamalıyam.

Alqoritm

  • İkili axtarış cavab
  • Hər bir ədəd1[i] üçün cari təxmindən az və ya bərabər olan məhsulların sayını sayın

Diqqət çəkən məsələlər:

  1. min max
  2. ikili axtarış sonunun daxil olub-olmamasından xəbərdar olun
  3. Hesab/indeks yeniləməsinin baş verdiyindən xəbərdar olun, əgər onu təsdiqləyən bənd ən böyük dəyərdirsə, k sayı ondan azdır və ya

Kodu

İki çeşidlənmiş massivin K-ci ən kiçik məhsulu üçün C++ kodu

class Solution {
public:
    bool check(long long midval,vector<int>& nums1, vector<int>& nums2, long long k){
        long long cnt=0;
        for(int i=0;i<nums1.size();i++)
        {
            long long val=nums1[i];
                        
      //If val == 0, product of val and each element in nums2 will be 0. And if midval>=0, then because all
      //products are 0, all products will be smaller or equal to midval. So we can add all products in the answer
      if(val==0 and midval>=0)
                cnt+=nums2.size();
            
            else if(val>0)
                cnt+=findmaxIndex(nums2,val,midval);
            
            else if(val<0)
                cnt+=findminIndex(nums2,val,midval);
        }
        return cnt>=k;
    }
    
    int findmaxIndex(vector<int>&nums2 , long long  val , long long midval)
    {
        int l = 0  , r = nums2.size()-1 , res=  -1;
        while(l<=r)
        {
            long long mid = (l+r)/2;
            if(val*nums2[mid]<=midval)
            {
                res=mid;
                l=mid+1;
            }
            else r=mid-1;
        }
        return res+1;
    }
    
    int findminIndex(vector<int>&nums2 , long long  val , long long midval)
    {
        int l = 0  , r = nums2.size()-1 , res=  r+1;
        while(l<=r)
        {
            long long mid = (l+r)/2;
            if(val*nums2[mid]<=midval)
            {
                res=mid;
                r=mid-1;
            }
            else l=mid+1;
        }
        return nums2.size()-res;
    }
    
    long long kthSmallestProduct(vector<int>& nums1, vector<int>& nums2, long long k) {
        long long l=-1e10,r=1e10,res=-1;
        while(l<=r){
            long long mid = (l+r)/2;
            // cout<<mid<<endl;
            if(check(mid,nums1,nums2,k)) {
                res=mid;
                r=mid-1;
            }
            else l=mid+1;
        }
        return res;
    }
};

İki çeşidlənmiş massivin ən kiçik məhsulu üçün Java kodu

class Solution {
    static long INF = (long) 1e10;
    public long kthSmallestProduct(int[] nums1, int[] nums2, long k) {
        int m = nums1.length, n = nums2.length;
        long lo = -INF - 1, hi = INF + 1;
        while (lo < hi) {            
            long mid = lo + ((hi - lo) >> 1), cnt = 0;
            for (int i : nums1) {
                if (0 <= i) {
                    int l = 0, r = n - 1, p = 0;
                    while (l <= r) {
                        int c = l + ((r - l) >> 1);
                        long mul = i * (long) nums2[c];
                        if (mul <= mid) {
                            p = c + 1;
                            l = c + 1;
                        } else r = c - 1;
                    }
                    cnt += p;
                } else {
                    int l = 0, r = n - 1, p = 0;
                    while (l <= r) {
                        int c = l + ((r - l) >> 1);
                        long mul = i * (long) nums2[c];
                        if (mul <= mid) {
                            p = n - c;
                            r = c - 1;
                        } else l = c + 1;
                    }
                    cnt += p;
                }
            }
            if (cnt >= k) {
                hi = mid;
            } else lo = mid + 1L;
        }
        return lo;
    }
}

İki çeşidlənmiş massivin K-ci ən kiçik məhsulu üçün mürəkkəblik təhlili LeetCode Həlli

Zamanın mürəkkəbliyi

O (10^10 x M log N)

Kosmik Mürəkkəblik

O (1)

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

Şərh yaz

Translate »