Kombinasiya cəmi Leetcode həlli

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Çiy kərpic Airbnb Amazon alma Atlassian Bloomberg ByteDance eBay Facebook Goldman Sachs google LinkedIn microsoft Kahin Snapchat kvadrat Über VMware Walmart Laboratoriyaları
alqoritmlər Geyim Geri qayıtma kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 132

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 Combination Sum Leetcode Solution bizə təqdim edir array və ya tam ədədlərin siyahısı və hədəf. Verilən hədəfə əlavə olunan neçə dəfə bu tam ədədlərdən istifadə edilə bilən birləşmələri tapmağımız söylənilir. Beləliklə, daha rəsmi olaraq verilmiş tam ədədləri verilmiş hədəfə əlavə edəcək qədər istifadə edə bilərik. Tələb olunan nəticə, cəmi verilən hədəfə bərabər olan birləşmələrdir.

misalKombinasiya cəmi Leetcode həlliPin

candidates = [2,3,6,7], target = 7
[[2,2,3],[7]]

İzahat: Verilən nəticə verilmiş hədəfə qədər cəmlənir. Başqa hər hansı bir kombinasiya tapmağa çalışsaq da. Eyni tam ədədləri fərqli bir sıra ilə düzəldəcəyik. Ancaq sifariş yalnız kombinasiyaların əhəmiyyəti yoxdur.

candidates = [2,3,5], target = 8
[[2,2,2,2],[2,3,3],[3,5]]

İzahat: Eyni tam ədədi istənilən dəfə istifadə edə bildiyimiz üçün. Çıxışda, ilk çıxışda 2-dən çox dəfə istifadə etdik. Eynilə, ikinci çıxışda 2 təkrarlanır. Bütün 3 nəticənin verilmiş hədəfə yekunlaşdığını yoxlaya bilərik.

Combination Sum Leetcode Həlli üçün yanaşma

Problem üçün yanaşmanı tapmaq asandır. Ümumiyyətlə, bu kimi problemlərdə geri çəkilmədən istifadə etməyimiz tələb olunur. Çünki bu kimi suallarda tam bir axtarış aparıb cavabını tapmağımız tələb olunur. Əvvəlcə bizə verilən tam ədədin siyahısını sıralayırıq. Bundan sonra, cari müvəqqəti ədədi siyahısına bir tam ədədi əlavə etməyə və verilən hədəfə əlavə etmək üçün lazım olan qalan cəmi izləməyə davam edən bir rekursiv funksiya yaradırıq. Yəni rekursiv funksiyanın içərisində iki əsas hal saxlayırıq. Birinci baza tələb olunan qalan məbləğin mənfi olub olmadığını yoxlamaqdır. Bu vəziyyətdə rekursiv funksiyadan qayıdacağıq. Qalan cəm sıfıra bərabərdirsə, ikinci əsas vəziyyət tələb olunan şərtdir. Qalan cəmi sıfırsa, bu, tələb olunan hədəfə çatdığımız deməkdir. Bu nöqtədə, cari müvəqqəti tam ədədi siyahını, çıxan massivə basırıq.

Kodu

Combination Sum Leetcode Solution üçün C ++ kodu

#include <bits/stdc++.h>
using namespace std;

void backtrack(vector<vector<int>> &output, vector<int> &current, vector<int> &candidates, int remain, int start){
    if(remain < 0)
        return;
    else if(remain == 0)output.push_back(current);
    else {
        for(int i=start;i<candidates.size();i++){
            current.push_back(candidates[i]);
            backtrack(output, current, candidates, remain - candidates[i], i);
            current.pop_back();
        }
    }
}

vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
    vector<vector<int>> output;
    vector<int> current;
    sort(candidates.begin(), candidates.end());
    backtrack(output, current, candidates, target, 0);
    return output;
}

int main(){
  vector<int> cand = {2, 3, 6, 7};
  vector<vector<int>> output = combinationSum(cand, 7)	;
  for(auto x: output){
    for(auto y: x)
      cout<<y<<" ";
    cout<<endl;
  }
}
2 2 3 
7

Combination Sum Leetcode Solution üçün Java kodu

import java.util.*;
import java.lang.*;
import java.io.*;

class Main
{
  public static List<List<Integer>> combinationSum(int[] nums, int target) {
      List<List<Integer>> list = new ArrayList<>();
      Arrays.sort(nums);
      backtrack(list, new ArrayList<>(), nums, target, 0);
      return list;
  }
  
  private static void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int remain, int start){
      if(remain < 0) return;
      else if(remain == 0) list.add(new ArrayList<>(tempList));
      else{ 
          for(int i = start; i < nums.length; i++){
              tempList.add(nums[i]);
              backtrack(list, tempList, nums, remain - nums[i], i); // not i + 1 because we can reuse same elements
              tempList.remove(tempList.size() - 1);
          }
      }
  }

  public static void main (String[] args) throws java.lang.Exception
  {
    int[] nums = {2, 3, 6, 7};
    List<List<Integer>> output = combinationSum(nums, 7);
    for(List<Integer> x: output){
      for(Integer y: x)
        System.out.print(y+" ");
      System.out.println();
    }
  }
}
2 2 3
7

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

O (N ^ (M / T + 1)) burada N - namizəd sayı, M - verilən bütün tam ədədlər arasında ən kiçik namizəddir və T - hədəf dəyərdir. Beləliklə, zamanın mürəkkəbliyi eksponensialdır və alqoritmin rekursiv geri çəkildiyi üçün bu gözlənilir.

Kosmik Mürəkkəblik

O (T / M), burada T hədəf dəyərdir və M bütün digər namizədlər arasında minimal elementdir.

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