Ardıcıl Leccode həllinə qədər daşların hərəkəti

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Facebook
alqoritmlər Beyin həvəskarı kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 59

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.

Problem bəyanat

Bu problemdə, a, b və c mövqelərində bizə üç daş verilir. Aşağıdakı addımı bir və ya daha çox dəfə yerinə yetirərək onları ardıcıl etməliyik.
Hər addımda sol və ya sağ daş seçib soldan sağa daş arasına bir yerə qoyacağıq.
Gəlin aşağıdakı şəklə daha yaxşı yanaşaq:
Ardıcıl Leccode həllinə qədər daşların hərəkətiPin
Bu daşları ardıcıl etmək üçün həm minimum, həm də bu cür addımların sayına cavab verməliyik.

misal

a = 1, b = 2, c = 5
[1,2]

İzahat: Daşı 5-dən 3-ə aparın və ya daşı 5-dən 4-ə 3-ə aparın.

a = 4, b = 3, c = 2
[0,0]

Heç bir hərəkət edə bilmərik.

a = 3, b = 5, c = 1
[1,2]

Daşı 1-dən 4-ə aparın; və ya daşı 1-dən 2-yə 4-ə aparın.

Yanaşma

Əvvəlcə maksimum addımları necə hesablamaq barədə danışaq. Sadəcə deyə bilmərikmi ki, hərəkət sayının maksimum həddi yalnız aşırı olan hər iki daş 1 vahid orta daşa yaxınlaşdıqda olacaqdır.
Beləliklə, sol daşla orta daş arasındakı mövqe sayı + orta daşla sağ daş arasındakı mövqe sayı onları ardıcıl etmək üçün maksimum addımlarımız olacaqdır.
Ardıcıl Leccode həllinə qədər daşların hərəkəti
İndi əsas problem minimum addım sayını necə hesablamaqdır. Aşağıdakıları başa düşərək minimumu tapa bilərik şərait.
Sol daşla orta daş arasındakı yerlərin sayını boşluq, orta daşla sağ daş arasındakı mövqelərin sayını isə boşluq adlandıraq.
Bu daşların başlanğıc vəziyyəti barədə aşağıdakı 4 vəziyyətdən yalnız biri deyilə bilər.

1. Daşlar artıq ardıcıl olduqda yəni lspace = 0 və rspace = 0 olduqda min_steps = 0.

Ardıcıl Leccode həllinə qədər daşların hərəkətiPin2. Başqa üç daşdan ikisi ardıcıl olarsa, yəni lspace = 0 və ya rspace = 0 olarsa, onda ən çox daşı yalnız 1 addımda orta daşa yaxın yerə qoya bilərik, beləliklə min_steps = 1.

Beyin həvəskarıPin3. Üç daşdan hər hansı ikisinin arasındakı boşluq 1 olduqda başqa bir şeydir, yəni lspace = 1 və ya rspace = 1 olduqda. Sonra ən çox daşı iki yaxın daş arasında qoymaq olar (yaxın daşların aralarında yalnız bir mövqedə olduğunu unutmayın) yalnız bir addımda.
Beləliklə, onları ardıcıl etmək yalnız 1 addımda baş verə bilər. Beləliklə, min_steps = 1.

Beyin həvəskarı4. Hər iki tərəfdəki daşlar başqa hər birinə 1 addım orta daşların qonşusuna qoyula bilər. Beləliklə, min_steps = 1 + 1 = 2.
Ardıcıl Leccode həllinə qədər daşların hərəkəti

Həyata keçirilməsi

Ardıcıl Leccode həllinə qədər daşları daşımaq üçün C ++ proqramı

#include <bits/stdc++.h>
using namespace std;
vector<int> numMovesStones(int a, int b, int c) 
{
    int left=min(a,min(b,c));
    int right=max(a,max(b,c));
    int mid=(a!=left && a!=right )?a:(b!=left && b!=right)?b:c;
    int lspace=mid-left-1;
    int rspace=right-mid-1;
    int max=lspace+rspace,min=0;
    if(lspace==0 && rspace==0)min=0;
    else if(lspace==0 || rspace==0)min=1;
    else if(lspace==1 || rspace==1)min=1;
    else min=2;
    vector<int> ans{min,max};
    return ans;
}
int main()
{
   vector<int>ans=numMovesStones(1,2,5);
   cout<<ans[0]<<" "<<ans[1]<<endl;
}
1 2

Ardıcıl Leccode həllinə qədər daşları daşımaq üçün Java proqramı

#include <bits/stdc++.h>
using namespace std;
vector<int> numMovesStones(int a, int b, int c) 
{
    int left=min(a,min(b,c));
    int right=max(a,max(b,c));
    int mid=(a!=left && a!=right )?a:(b!=left && b!=right)?b:c;
    int lspace=mid-left-1;
    int rspace=right-mid-1;
    int max=lspace+rspace,min=0;
    if(lspace==0 && rspace==0)min=0;
    else if(lspace==0 || rspace==0)min=1;
    else if(lspace==1 || rspace==1)min=1;
    else min=2;
    vector<int> ans{min,max};
    return ans;
}
int main()
{
   vector<int>ans=numMovesStones(1,2,5);
   cout<<ans[0]<<" "<<ans[1]<<endl;
}
1 2

Ardıcıl Leccode həllinə qədər hərəkət edən daşlar üçün mürəkkəblik analizi

Zamanın mürəkkəbliyi

O (1): Alqoritmimizdə sadəcə sadə şərti ifadələrdən istifadə etdik. Beləliklə, zamanın mürəkkəbliyi O (1) -dir.

Kosmik Mürəkkəblik 

O (1): Sol, sağ, boşluq, 2 ölçülü və s. Kimi dəyişənlərdən başqa, əlavə boşluq yaratmadıq, beləliklə kosmik mürəkkəblik O (1) -dir.

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