Permutations - Leetcode 46 - Python

แชร์
ฝัง
  • เผยแพร่เมื่อ 11 ก.ย. 2024

ความคิดเห็น • 34

  • @hasferrr
    @hasferrr 2 หลายเดือนก่อน +9

    i think the backtracking solution with decision tree is more intuitive. For each recursion call, you can store the number that has already added to the Answer list into the HashSet, and for each recursion call you can skip the number that already in the HashSet
    function permute(nums: number[]): number[][] {
    const result = []
    const dfs = (set: Set, pm: number[]): void => {
    if (pm.length === nums.length) {
    result.push([...pm])
    return
    }
    for (let i = 0; i < nums.length; i++) {
    if (set.has(nums[i])) {
    continue
    }
    pm.push(nums[i])
    set.add(nums[i])
    dfs(set, pm)
    pm.pop()
    set.delete(nums[i])
    }
    }
    dfs(new Set(), [])
    return result
    }

    • @ashkan.arabim
      @ashkan.arabim หลายเดือนก่อน +1

      yeah I thought the same. he's also slicing and inserting in the middle of arrays which are O(n) operations.

    • @bobert6259
      @bobert6259 หลายเดือนก่อน +1

      I don't think I could've thought of this solution, the one I came up with was the backtracking one, so it's nice to learn a new approach at least!
      List copy is O(n) and slicing+inserting is also O(n). The backtracking approach only has a list copy (assuming appending and popping are O(1)).
      def permute(self, nums: List[int]) -> List[List[int]]:
      if not nums:
      return []
      permutations = [] # To store all our permutations
      curr_indices = set() # To keep track of the indices used so far
      curr_path = [] # What stores the current permutation (temporarily)
      size = len(nums) # Store it for readability
      def dfs(idx):
      if len(curr_indices) == size: # Base case when we find a permutation
      permutations.append(curr_path.copy()) # Add a copy of the permutation
      return
      for i in range(size): # Go over every remaining possible addition
      if i not in curr_indices: # Constraint - do not explore already explored index
      curr_indices.add(i) # Keep track of added indices
      curr_path.append(nums[i]) # Store the updated permutation
      dfs((i + 1) % size) # Explore this new branch
      curr_indices.remove(i) # Once explored, remove it so this set can be used again
      curr_path.pop() # Same reasoning as removing from the set
      dfs(0)
      return permutations

    • @spiceybyte
      @spiceybyte 26 วันที่ผ่านมา

      I came up with this direction as well, neetcode is usually great but I like this alternative solution better.

    • @wussboi
      @wussboi 11 วันที่ผ่านมา

      @@bobert6259 love it. clear and makes sense to me. Here is mine slightly different
      class Solution:
      def permute(self, nums: List[int]) -> List[List[int]]:
      """ n! permutations """
      perms = []
      curr_path = []
      n = len(nums)
      used = [False] * n # track numbers that have be used
      def dfs():
      # base case to trigger return
      if len(curr_path) == n:
      perms.append(curr_path.copy())
      return
      # recursive case
      for i in range(n): # try all possible idx until find unused number.
      if not used[i]:
      # update curr_pth & used vector
      curr_path.append(nums[i])
      used[i] = True
      dfs() # DFS recursion: explore what other numbers can be used
      # going up the function stack
      curr_path.pop() # remove i'th value from curr_path/used
      used[i] = False
      dfs()
      return perms

    • @user-dv7ti2zm9q
      @user-dv7ti2zm9q 7 วันที่ผ่านมา

      yeah i agree, this is a rare case where neet's solution was harder to grasp

  • @riddle-me-ruben
    @riddle-me-ruben 2 หลายเดือนก่อน +7

    This is a way better explanation than the old video. I went months with this problem unsolved because I just couldn't understand, but this explanation helped me tremendously. Thanks!

  • @Gomeroff
    @Gomeroff 2 หลายเดือนก่อน +13

    I live in Russia, a new day has not yet begun, and you are already solving a new problem)

  • @dannygarcia7116
    @dannygarcia7116 29 วันที่ผ่านมา +2

    Easy to understand (imo) DFS solution:
    class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
    res = []
    def dfs(perm):
    if len(perm) == len(nums):
    res.append(perm[:])
    return

    for i in range(len(nums)):
    if nums[i] in perm:
    continue
    perm.append(nums[i])
    dfs(perm)
    perm.pop()

    dfs([])
    return res

    • @1000timka
      @1000timka 11 วันที่ผ่านมา

      this was my solution basically word for word but I think the problem with it is that you add time when you do the check to see if nums[i] is in perm. The overall complexity is still O(n!) so it probably doesn't matter but just something to be aware of yk.

  • @AVGVSTVSivlivs
    @AVGVSTVSivlivs 2 หลายเดือนก่อน +1

    Swapping indices method for this question is probably more clear and you should also review Longest Palindromic Substring question. Solutions in the other questions are quite optimal.
    Thanks a lot!

  • @bandarupawankumar7549
    @bandarupawankumar7549 2 หลายเดือนก่อน +2

    Thank you neetcode for again working on this problem :)

  • @johnveracruz2102
    @johnveracruz2102 2 หลายเดือนก่อน +1

    @NeetcodeIO PLS add a functionality on your site to not show the topics for the questions. want to do them in order without knowing the topic. thanks

  • @ChandanKumar-hk2ds
    @ChandanKumar-hk2ds 4 วันที่ผ่านมา

    def permute(self, nums: List[int]) -> List[List[int]]:
    res = []
    def backtrack(start,curr):
    print(curr)
    if len(curr) == len(nums):
    res.append(curr.copy())
    return

    for j in range(len(nums)):
    if nums[j] not in curr:
    curr.append(nums[j])
    backtrack(j+1,curr)
    curr.pop()
    backtrack(0,[])
    return res

  • @zereftribbiani8130
    @zereftribbiani8130 หลายเดือนก่อน +1

    I wouldn't recommend this way of doing it since slicing and inserting are O(n) operations

  • @jacobli2676
    @jacobli2676 11 วันที่ผ่านมา

    The subproblem method is so elegant.

  • @MyPodie
    @MyPodie 2 หลายเดือนก่อน +1

    Morning Neetcode!

  • @pastori2672
    @pastori2672 2 หลายเดือนก่อน +8

    i feel like a time traveler

    • @NguyenLe-nw2uj
      @NguyenLe-nw2uj หลายเดือนก่อน +1

      me too, i didn't look at the published timestamp, everything is kinda strange tho.

  • @user-vu4ng4rb8k
    @user-vu4ng4rb8k 2 หลายเดือนก่อน +1

    hey also do video for cherry pickup 1 and bst to sorted DLL

  • @jitpatel7692
    @jitpatel7692 หลายเดือนก่อน

    You Make it easy, Thank you

  • @logn-x5e
    @logn-x5e หลายเดือนก่อน +1

    Ok, this one's really the first problem in neetcode150 that is actually VERY easy to understand the goal but I personally find it extremely hard to implement

  • @alexprogrammer
    @alexprogrammer 17 วันที่ผ่านมา

    java version of this solution:
    class Solution {
    public List permute(int[] nums) {
    if (nums.length == 0) {
    return List.of(List.of());
    }
    List res = new ArrayList();
    List perms = permute(Arrays.copyOfRange(nums, 1, nums.length));
    for (List p : perms) {
    for (int i = 0; i < p.size() + 1; i++) {
    List pCopy = new ArrayList(p);
    pCopy.add(i, nums[0]);
    res.add(pCopy);
    }
    }
    return res;
    }
    }

  • @mukeshrawat1304
    @mukeshrawat1304 2 หลายเดือนก่อน

    Is it possible for you to have some sort of poll or something where we could ask for a video solution of a leetcode problem which you haven't already solved. Because there are quite a few problems which don't have a proper solution on TH-cam and God knows when they will appear as POTD.

    • @DeathSugar
      @DeathSugar 2 หลายเดือนก่อน

      I guess thats what his site is for.

  • @ethanking123
    @ethanking123 16 วันที่ผ่านมา +1

    This solution doesn't help much. It doesn't provide any useful insights for similar problems, and I'm not sure why it was explained to us.

  • @kanjurer
    @kanjurer 2 หลายเดือนก่อน

    I actually just solved the problem yesterday lmao

  • @ijavd
    @ijavd 2 หลายเดือนก่อน

    Morning

  • @pushkarsaini2
    @pushkarsaini2 2 หลายเดือนก่อน

    Now Solve 31 Next Permutation

  • @m_jdm357
    @m_jdm357 2 หลายเดือนก่อน +1

    The worst solution I've seen.

    • @NeetCodeIO
      @NeetCodeIO  2 หลายเดือนก่อน +3

      anything specific about it that you did not like?

    • @m_jdm357
      @m_jdm357 2 หลายเดือนก่อน

      @@NeetCodeIO I tried to understand it but it's really bad when debugging or writing down on paper. Really hard to understand. I found this solution:
      def permute(self, nums: List[int]) -> List[List[int]]:
      res = []
      def backtrack(arr):
      if len(arr) == len(nums):
      res.append(arr.copy())
      return

      for i in range(len(nums)):
      if nums[i] in arr:
      continue
      arr.append(nums[i])
      backtrack(arr)
      arr.pop()

      backtrack([])
      return res
      This I got. If no one supports me and everyone thinks your solution is good. Then I'm wrong.

    • @yunusemreozvarlik2906
      @yunusemreozvarlik2906 หลายเดือนก่อน

      @@m_jdm357 Actually, I understood the concept better through this video and the solution that is being implemented is similar to yours.
      th-cam.com/video/gFm1lEfnzUQ/w-d-xo.html

    • @uditisinha305
      @uditisinha305 หลายเดือนก่อน +2

      you could be a bit nicer :D