Eşik Leetcode Həlli verilən ən kiçik bölücüyü tapın

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur AppDynamics google SAP Walmart Laboratoriyaları
alqoritmlər kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 77

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Bu yazı Eşik Leetcode Həlli verilmiş Ən Kiçik Bölücüyü tapın

Problem bəyanat

“Eşik verilmiş ən kiçik böləni tap” problemində bizə ədədlər seriyası və eşik dəyər verilir. Dəyişən “nəticə” massivdəki elementlər bölücüyə bölündüyü zaman bütün cavabların cəmi kimi təyin olunur. Bizim vəzifəmiz, bölənin mümkün olan ən kiçik dəyərini, nəticənin eşikdən kiçik və ya bərabər olacağı şəkildə tapmaqdır.

Dizidəki elementləri bölücüyə böldükdə, bölünmə cavabı olaraq tavan dəyərini nəzərə alırıq. Bölücü olmalıdır a müsbət tam.

misal

arr=[1,2,5,9], threshold=6
5

Explanation: bütün elementləri 1 nəticəyə böldükdə (1 + 2 + 5 + 9) 17 6-dan böyük olan XNUMX olur. Beləliklə, nəticənin dəyərini azaltmaq üçün bölücünün dəyərini artıracağıq.

İndi bölücü = 4 hesab etsək, nəticə 1-dan böyük olan (1 + 2 + 3 + 7) 6 olur. Beləliklə, nəticənin dəyərini azaltmaq üçün bölücünün dəyərini artıracağıq.

bölücü = 5 hesab etsək, nəticə (1 + 1 + 1 + 2) 6. Yəni cavab 5-dir.

Yanaşma

Bizim vəzifəmiz tapmaqdır minimum dəyəri bölücünün. Beləliklə, əvvəlcə nə ola biləcəyini düşünək minimum və maksimum bölmənin dəyəri.

  • Bölücünün minimum dəyəri 1-ə bərabərdir, çünki bölücü müsbət tam ədəddir.
  • Bölücünün maksimum dəyərindən bəhs edərkən onu ədədlər cərgəsindəki maksimum dəyərə endirə bilərik, çünki bundan böyük dəyərlər həmişə eyni cavabı verəcəkdir.

Eşik Leetcode Həlli verilmiş ən kiçik böləni tapınPin

  • İndi bizdə var minimum və maksimum əlimizdəki bölənin dəyəri. İndi yeganə vəzifəmiz ən kiçik böləni tapmaqdır.
  • [Min, max] aralığındakı hər bir dəyəri əl ilə yoxlaya bilərik, lakin aralığdakı dəyərlər sıralandığı üçün bir İkili axtarış alqoritmi daha yaxşı vaxt mürəkkəbliyi üçün.
  • Bölücünün ən kiçik dəyərini öyrənməyə çalışırıq ki, başlanğıc <= bitdikdə döngə bitsin. Sonda başlanğıc son cavabı özündə cəmləşdirəcək, buna görə dəyərini qaytaracağıq.

Kodu

Eşik Leetcode Həlli verilmiş ən kiçik böləni tapmaq üçün C ++ kodu

#include <bits/stdc++.h> 
using namespace std; 
   int smallestDivisor(vector<int>& nums, int threshold) {
        int s=1,e=*max_element(nums.begin(),nums.end());
        int n=nums.size();
        while(s<=e)
        {
            int mid=s+(e-s)/2;
            int sum=0;
            for(int i=0;i<n;i++)
                sum=sum+(nums[i]+mid-1)/mid;
            if(sum<=threshold)
            {
                e=mid-1;
            }
            else
            {
                s=mid+1;
            }
                
        }
        return s;
    }

int main() 
{ 
 vector<int> arr = {1,2,5,9}; 
 int threshold = 6;
 cout<<smallestDivisor(arr,threshold)<<endl; 
 return 0;
}
5

Eşik Leetcode Həlli Verilən Ən Kiçik Bölücüyü tapın üçün Java kodu

import java.util.Arrays; 
public class Tutorialcup {
 public static  int smallestDivisor(int[]  nums, int threshold) {
        int s=1,e=Arrays.stream(nums).max().getAsInt();
        int n=nums.length;
        while(s<=e)
        {
            int mid=s+(e-s)/2;
            int sum=0;
            for(int i=0;i<n;i++)
                sum=sum+(nums[i]+mid-1)/mid;
            if(sum<=threshold)
            {
                e=mid-1;
            }
            else
            {
                s=mid+1;
            }
                
        }
        return s;
    }

  public static void main(String[] args) {
    int [] arr = {1,2,5,9}; 
    int threshold = 6;
    int ans=  smallestDivisor(arr,threshold);
    System.out.println(ans);
  }
}

 

5

Eşik Leetcode Həlli Verilən Ən Kiçik Bölücüyü Tapın Karmaşıklıq Analizi

Zaman mürəkkəbliyi

Yuxarıdakı kodun zaman mürəkkəbliyi O (n) çünki biz saylar cərgəsini yalnız bir dəfə keçirik. Burada n saylar massivinin uzunluğu.

Kosmik mürəkkəblik

O (1) çünki yaddaşdan yalnız cavabı saxlamaq üçün istifadə edirik.

References

Crack Sistemi Dizayn Müsahibələri
Translate »