Minimum Swaps to Group All 1's Together II - Leetcode 2134 - Python

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

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

  • @peacefulcat3578
    @peacefulcat3578 3 หลายเดือนก่อน +20

    0:57 In the example "0101101", you actually only need 1 swap to make "0001111" or "0111100".

  • @tuandino6990
    @tuandino6990 3 หลายเดือนก่อน +34

    My dumb ass brain stopped functioning and thought we can only do swap between two adjacent number and waste 1 hour on this problem...

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

      nah its not you, this problem is a bit evil for the beginning of the month lmao

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

      I also thought so. 😢

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

      Same here man

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

      Not one hours for me but a good 20 mins.

  • @finemechanic
    @finemechanic 3 หลายเดือนก่อน +8

    You can go from 2*N iterations to N + total_ones: calculate ones in the window nums[:total_ones] and then move your window of constant size from 0 to N-1.

  • @mudit7394
    @mudit7394 3 หลายเดือนก่อน +9

    holy shit this is so easy when you explained it lol. I tried the greedy approach and it worked until it failed for the test case lol ur approach is amazin

  • @sundew_ii
    @sundew_ii 3 หลายเดือนก่อน +11

    this one was tough :p

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

    great explanation sir!
    Fun Fact: we can skip the if statement to add 1 as the array only contains 1 and 0 so if we blindly take sum+=arr[i] it will work same i guess :/ but anyways what a great guy!!

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

    this is one of the greatest explanations ever

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

    the left pointer needs to go only up to N-1
    the for loop should be this:
    for r in range(N+total_ones)
    That way the "l" doesn't need mod, and it's faster for large N and small total_ones

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

      l,f=len(n),sum(n); o=t=sum(n[:f])
      for i,v in enumerate(n,f): o=max(o,t:=t+n[i%l]-v)
      return f-o

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

    Another approach: (using sliding windows ofc)
    total_ones=nums.count(1)
    l=0
    nums.extend(nums[:total_ones-1])

    zero_cnt=0
    res=float("inf")
    for r in range(len(nums)):
    zero_cnt+=not(nums[r])
    if (r-l+1)==total_ones:
    res=min(res,zero_cnt)
    zero_cnt-=not(nums[l])
    l+=1


    return res if res!=float("inf") else 0

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

      l,f=len(n),sum(n); o=t=sum(n[:f])
      for i,v in enumerate(n,f): o=max(o,t:=t+n[i%l]-v)
      return f-o

  • @quirkyquester
    @quirkyquester 14 วันที่ผ่านมา

    you are a genius brother!!! I tried backtrack loll, so complicated to write

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

    NICE SUPER EXCELLENT MOTIVATED

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

    the hints of this of this problem are pretty good they gave like 5 hints and the second hint gives it all away

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

    i think a better idea would be realizing that by grouping 1s tgt, 0s would be group tgt too, so you just keep track of cnt of 0s for the respective 0 wnd too.

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

      and you just take the min of the two ans

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

    For the circular part
    I tries consolidating zeros instead of ones , since if zeros are linearly together , ones also must be together , circular or otherwise.

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

    The % idea was really brilliant

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

    It felt to easy yet amazing after watching the first 3 minutes of your video ❤❤ i was able to solve it

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

    my solution, more consice and the loop is running N + # of 1's:
    def minSwaps(self, nums: List[int]) -> int:
    total = sum(nums)
    right = total
    if right == len(nums): return 0
    maxSub = sum(nums[:total])
    window = maxSub
    for left in range(len(nums)):
    window = window - nums[left] + nums[right]
    maxSub = max(maxSub, window)
    right = (right + 1) % len(nums)
    return total - maxSub

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

      l,f=len(n),sum(n); o=t=sum(n[:f])
      for i,v in enumerate(n,f): o=max(o,t:=t+n[i%l]-v)
      return f-o

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

    You probably could've made your run time a little more quicker if you exited the loops once the left pointer exceeds the length of the original array instead of going the full 2N. But yeah, this one was a doozy - I don't think I would have gotten it without the hints that they gave.

  • @Badrsh-tk4cd
    @Badrsh-tk4cd 3 หลายเดือนก่อน

    Can you solve the ready-made function in the list? Or is it forbidden?

  • @chien-yuyeh9386
    @chien-yuyeh9386 3 หลายเดือนก่อน +1

    Thanks for sharing!

  • @MaheshKumar-mh9mj
    @MaheshKumar-mh9mj 3 หลายเดือนก่อน

    in line 7 we can just got til n+totalOnes . 2*n is not required

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

    Thank you

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

    I was staring at this problem for 10 mins. Thinking about the intervals, and how to calculate average distance between dots......

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

    How'd you know this solution would work?

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

      You consider it against all possible cases. You devise cases and say to yourself that this solution must return this valid value if it works properly and if it don't, then something is wrong with the solution (using counter-examples).

  • @王瀚君-c3j
    @王瀚君-c3j 3 หลายเดือนก่อน

    Everyday thank you

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

    Another little tweak, you only have to check the max when you add another one at your right pointer.

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

    @neeetcode where to apply for the interview

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

    The reason why we never saw a Minimum Swaps to Group All 1's Together I is because it is premium-only. i guess it's the same problem without circular edge case

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

    Why we need window one, max_window_ones?

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

    Coded on my own

  • @SonuKumar-q5o1b
    @SonuKumar-q5o1b 3 หลายเดือนก่อน

    why neetcode website not able to open??????? i am facing issue from last 3-4 days

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

    I thought it would be a cakewalk

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

    Thank you for sharing. You can apply Sliding Window for counting minimum 0 in K window
    def minSwaps(self, nums: List[int]) -> int:
    """
    Calculate minimum sliding window for 0
    """
    k = nums.count(1)
    numZero = nums[:k].count(0)
    ans = numZero
    n = len(nums)
    for R in range(k, 2*n):
    if nums[R%n] == 0:
    numZero +=1
    if nums[(R-k)%n] == 0:
    numZero -= 1
    ans = min(ans, numZero)
    return ans

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

      l,f=len(n),sum(n); o=t=sum(n[:f])
      for i,v in enumerate(n,f): o=max(o,t:=t+n[i%l]-v)
      return f-o

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

    I couldn't even solve it using brute force and wasted an hour

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

    surprisingly ... i did not find this tough at all ! Simple sliding window.. with double the array size ! easy
    def minSwaps(self, nums: List[int]) -> int:
    ones = nums.count(1)
    double = nums+nums
    ct = nums[:ones].count(1)
    maxx = ct
    l=0
    for i in range(ones,len(double)):
    if double[i]==1:
    ct+=1
    if double[l]==1:
    ct-=1
    maxx = max(ct,maxx)
    l+=1
    return ones - maxx

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

      l,f=len(n),sum(n); o=t=sum(n[:f])
      for i,v in enumerate(n,f): o=max(o,t:=t+n[i%l]-v)
      return f-o

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

    4:12 🤔🤔

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

    I hate "guess the trick" questions

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

    l,f=len(n),sum(n); o=t=sum(n[:f])
    for i,v in enumerate(n,f): o=max(o,t:=t+n[i%l]-v)
    return f-o

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

    i hate circular array