Continuous Subarray Sum - Leetcode 523 - Python

Поділитися
Вставка
  • Опубліковано 12 вер 2024

КОМЕНТАРІ • 122

  • @mdazharuddin4684
    @mdazharuddin4684 2 роки тому +95

    We add {0 : -1} in dict not to handle case where 1st element is divisible by k. We add it to handle case where subarray starting from 0 is divisible by k.
    For example when k = 6 and nums = [1,2,3,4] and we don't initialize 0, we will get False.

    • @xinl9259
      @xinl9259 2 роки тому +6

      Thanks! I watched the video and could not understand why {0:-1} and you answered my question. Very appreciate!

    • @shin-wu
      @shin-wu 2 роки тому +2

      Great addition to the video! Thanks for the clarification.

    • @halahmilksheikh
      @halahmilksheikh 2 роки тому +5

      Yep. Also a way to get rid of that is to have `if (remainder == 0 && i > 0) return true` in the for loop

    • @a_maxed_out_handle_of_30_chars
      @a_maxed_out_handle_of_30_chars 9 місяців тому

      yeah, this makes sense

    • @user-mh4lq5ce6u
      @user-mh4lq5ce6u 9 місяців тому +2

      you Can Just Add this Condition
      if sum%k==0 and i>=1:
      return True

  • @khanofkhans4832
    @khanofkhans4832 2 роки тому +83

    Continuous Subarray Sum of PAIN

  • @erikshure360
    @erikshure360 Рік тому +40

    yeah, fuck this problem.

  • @hanklin4633
    @hanklin4633 2 роки тому +15

    Is it possible to think of hashing the remainder in an actual interview? What 'intuition' could anyone even come up with it in the first place?

  • @adam-zy5tb
    @adam-zy5tb 2 роки тому +16

    wouldn't space complexity be O(k) since you are storing at most k entries in the hashmap? i.e. if k = 6 you are storing at most 6 entries since the remainder would never be more than 5 (+1 more for the 0 edge case)

  • @mirceskiandrej
    @mirceskiandrej 2 роки тому +60

    This is not a medium question. It is hard, borderline extreme.
    If you see the solution, it becomes easy since it's memorable, but you cannot average easy and hard to get a medium question 😃

    • @shanemarchan658
      @shanemarchan658 Рік тому +4

      ikr. for days ive been trying LOL... really out of the box thinking to come up with this

    • @shivamshah6579
      @shivamshah6579 Рік тому

      100% true!

    • @CS_n00b
      @CS_n00b 10 місяців тому +4

      I was asked this question for a new grad job at a small company fml

  • @ObtecularPk
    @ObtecularPk 2 роки тому +112

    Again, how is someone able to come up with a solution like this in a time limit interview? This is the question that needs answering next video or something

    • @easynow6599
      @easynow6599 2 роки тому +37

      i am thinking the same..in most of these problems..I guess there are three ways: a) you should know the problem beforehand and solve it..so it would be relatively easy to repeat during interview..b) you get plenty of help from the interviewer and you kinda solve it with bugs or/and pseudocode..c) you have spend your life with LC and you solve it in 15' seeing first time..
      I dont see myself even close to option c and i guess i have to practice 10 times more..but i would be curious if someone who has passed the interview can tell

    • @halahmilksheikh
      @halahmilksheikh 2 роки тому +93

      Step 1: Solve it before the interview
      Step 2: Solve it during the interview and pretend you've never seen it

    • @rams2478
      @rams2478 2 роки тому +10

      I second that... looks interview is pure luck...

    • @josecabrera7947
      @josecabrera7947 2 роки тому +7

      @@easynow6599 I had an interview with a big tech company like last week. I was able to solve roughly 2 problems that I had never seen before that I would categorize as leetcode easy's. They had edge cases that took time and killed like 35 min. The other two however one was hard and the other was either hard or medium. I had no idea how to solve them. I was able to get some work in but couldnt pass all the cases. I later looked them up for hours and was able to find 1 similar but not entirely the same. I spent like 2 hours trying to understand and solve the problem I found. There is no way someone can solve these in 15 minutes.

    • @easynow6599
      @easynow6599 2 роки тому +4

      @@josecabrera7947 i dont know man..this leetcode looks like a BS system.. but discussing about that i think it's the optimal way to filter people..with a lot of false negatives (a lot of good people stay out because a problem was too hard to solve) and a some false positives (people that grind LC as hell, but in reality they dont know much stuff)..
      Anyway..i wish you good luck!

  • @redblacktech
    @redblacktech 3 місяці тому +2

    awesome vid! i'd like to add that the optimized solution is like two-sum in the sense that we're caching complementary values. once you see it this way it becomes intuitive, however, there's no way in hell the average person is going to figure that out without tons of practice doing leetcode questions specifically 🙃
    i'd ALSO like to add a one line intuition for the key point of this video:
    if we see two numbers that when % by k have the same remainder, then those numbers are either k away from each other (or multiple of k away from each other) - and this is exactly what the problem is asking us to find

  • @dantesmith7859
    @dantesmith7859 6 місяців тому +2

    I wrestled with this one for a couple hours... I was trying to store the prefix sum, not the remainder, and I was having a tough time making that work. Storing the remainders is a great idea, and made the code much more concise! Thanks!

  • @rongrongmiao3018
    @rongrongmiao3018 2 роки тому +6

    I hate math questions. To solve this problem all we need to know is that (a-b)%c = ((a%c) - (b%c)) % c. so to get a-b mod c = 0, just need to have this: a mod c = b mod c

  • @ivankok8399
    @ivankok8399 2 роки тому +4

    Nice solution and explanation. I was struggling to find a faster solution, but this duplicate remainder approach is very creative!

  • @Ryan-g7h
    @Ryan-g7h 23 години тому +1

    Hey guys also don't forget this video is missing a key detail:
    look into why we use elif i - remainder[r] > 1 instead of >=. It ties to the {0:-1}
    and a edge case such as [6,1,2], k = 6 -> should false but if we do >= return True

  • @vadimkokielov2173
    @vadimkokielov2173 2 роки тому +2

    first i want to make sure you, but also anyone else knows. I am not writing suggestions because I don't need your videos and the help they give. I need them a lot. I am intensively preparing for an interview. Whatever I write is anything I discover on top of your solutions.
    That said...You can spare the map and use a hash set. Just keep it trailing behind by one index, so you don't get any invalid values.
    I am sure you know this solution, and if you decided not to explain it because the mind xxxx of the problem itself is pain enough, then I absolutely agree with you. It's worth pointing out, however.

    • @hershjoshi3549
      @hershjoshi3549 3 місяці тому

      yeah you can def do it with a set and a prev value where prev = sum % k. Personally I find the hashmap solution a little easier to understand and remember.

  • @finchshi4342
    @finchshi4342 2 роки тому +4

    bro you are my favorite leetcode channel

    • @NeetCode
      @NeetCode  2 роки тому +3

      Appreciate that :)

  • @bluesteel1
    @bluesteel1 4 місяці тому +2

    I feel you need to be good at math to crack this one on your own.

  • @Dumbastic
    @Dumbastic 2 роки тому +1

    Thank you for the clear explanation, I saw the solution before, but I couldn't get behind why it was neccessary to have a duplicated modulo result value in the array. You were able to explain it in a simple manner, appreciate it a lot! Keep up the good work! :)

  • @danielcontreras9343
    @danielcontreras9343 2 роки тому +10

    I am a continuous sub array

  • @CreeperFace75
    @CreeperFace75 2 роки тому +3

    great vid! No idea how u come out with these solutions but they make perfect sense

  • @numberonep5404
    @numberonep5404 2 роки тому +2

    Omg the the solution is so damn cool ! I tried out the same lines you talked about in the beginning but it led me nowhere so i was feeling pretty dumdum :p Thank you for your clear explanation as always, it really helps :)

  • @avanishgvyas1992
    @avanishgvyas1992 24 дні тому

    Nice explanation. Impossible to come up with this solution in 25 minutes while under stress in an interview.

  • @clumsyroad4026
    @clumsyroad4026 3 місяці тому

    Your original trains of thought about the 2sum problem as well as a prefix sum approach were also doable, if you had dived deeper into them and made minor modifications. Here is a 2sum-like approach to solving this problem in one pass:
    class Solution:
    def checkSubarraySum(self, nums: List[int], k: int) -> bool:
    seen = set()
    prv = cur = 0
    for x in nums:
    cur, prv = (cur + x) % k, cur
    if cur in seen:
    return True
    seen.add(prv)
    return False

  • @aadityakiran_s
    @aadityakiran_s 3 місяці тому +2

    Got asked a harder variation of this in a Google interview. No real hint was also provided by the interviewer. I suppose luck is also a factor. If you've seen the problem before or if you're able to fit whatever problem, you get into the pattern that you've seen before.

  • @priyankachoudhary3694
    @priyankachoudhary3694 Рік тому

    Amazing explanation! I don't think I would have been ever able to understand this question without your elegant and detailed explanation about what works and what doesn't work and why it doesn't work.

    • @varunshrivastava2706
      @varunshrivastava2706 Рік тому +1

      I was asked the same question in my Accolite Digital interview, glad I had already solved it before otherwise I would have been doomed!!!!

  • @algosavage7057
    @algosavage7057 Рік тому

    just best. I'm watching you for about a year and just wanna say that u'r the best! Thanks for ur job!

  • @tusharnain6652
    @tusharnain6652 Рік тому +1

    Only explanation that my brain understood. Thank you Neetcode.

  • @shadowthehedgehog2727
    @shadowthehedgehog2727 2 роки тому +2

    Damn this solution is crazy.. i don’t think I would even think of this

  • @samridhanand4926
    @samridhanand4926 3 місяці тому

    The thought process that helped me get to the solution was by thinking of the problem Largest Subarray with sum 0, as we use hashmap to store the sum with index.

  • @vdyb745
    @vdyb745 2 роки тому +1

    Awesome explanation.... for an insane problem. Great work !!!!!

  • @mohammadkareem1187
    @mohammadkareem1187 2 роки тому +1

    Very elegant explanation. Thanks a lot. Can you please do Leetcode 2060 as well?

  • @Will-dr9cf
    @Will-dr9cf 7 місяців тому

    The time complexity of the brute force solution (by summing up the sub-arrays in sliding windows with cumulative sum) seems to be O(n!), which is worse than O(n^2).

  • @ShivangiSingh-wc3gk
    @ShivangiSingh-wc3gk 19 днів тому

    Yeah, after coming to prefix sums, I couldnt think about this so tricky either you see the math or you dont

  • @SomneelMaity
    @SomneelMaity Рік тому

    Amazing Explanation Bro. Your explanation videos made my DSA skills far better.

  • @tomtran6936
    @tomtran6936 10 місяців тому

    There is a step after calculating r you can also check if r == 0 return True

  • @vinuk.vijayakumar8023
    @vinuk.vijayakumar8023 Рік тому +1

    used this to solve 974. made a few changes.
    def checksumarray_k(nums, k):
    remainder={0:[-1]}
    total=0
    count=0
    for idx, element in enumerate(nums):
    total+=element
    r=total%k
    if r not in remainder:
    remainder[r]=[idx]
    else:
    count+=len(remainder[r])
    remainder[r].append(idx)
    return count

  • @sitam-meur4317
    @sitam-meur4317 2 роки тому

    This solution is just awesome !!! Thanks @NeetCode .

  • @srinivasareddychalla-i2o
    @srinivasareddychalla-i2o 3 місяці тому

    So key point here is if prefixsum%k=r and (prefixsum+x1+x2+•••••+xn)%k=r then undoubtedly x1+x2+•••••+xn is multiple of k

  • @suyashpurwar631
    @suyashpurwar631 Рік тому

    I managed to do this on my own with prefix sum approach. My approach is different though and is more than O(n). Following is the code.
    bool checkSubarraySum(vector& nums, int k) {
    int sum = 0;
    unordered_map hash;
    for (int i = 0; i < nums.size(); i++) {
    sum += nums[i];
    if (!i) {
    hash[sum] = i;
    continue;
    }
    if (sum % k == 0) return true;
    int j = 0;
    while (k * j < sum) {
    int rem = sum - k * j;
    if (hash.count(rem) && i - hash[rem] >= 2) {
    return true;
    }
    j++;
    }
    if (!hash.count(sum)) hash[sum] = i;
    }
    return false;
    }

  • @lesterdelacruz5088
    @lesterdelacruz5088 5 місяців тому +1

    Mind blown. Who would've come up with that trick from the get go haha?

  • @henryrussell7392
    @henryrussell7392 2 роки тому +1

    Amazing explanation as always

  • @andrewpagan
    @andrewpagan Рік тому

    Thank you so so so so soooo much for this. I was on the right track with modulo and thinking of a sliding window, but was missing the last piece with prefix sum.

  • @shelbys4252
    @shelbys4252 2 роки тому

    only leetcoder who makes sense tbh. Well done.

  • @IK-xk7ex
    @IK-xk7ex 11 місяців тому

    Yep, it's hard to come up with the part 'i-remainder[r] > 1' by my own. It's great that we leave in the era of streaming to gain best practices

  • @fazilshafi8083
    @fazilshafi8083 6 місяців тому

    Java Solution:
    class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
    HashMap map = new HashMap(); // To store
    int prefixSum = 0;
    map.put(0, -1);

    for (int i = 0; i < nums.length; i++) {
    prefixSum += nums[i];
    int remainder = k == 0 ? prefixSum : prefixSum % k;

    if (map.containsKey(remainder)) {
    int length = i - map.get(remainder);
    if (length >= 2) {
    return true;
    }
    } else {
    map.put(remainder, i);
    }
    }

    return false;
    }
    }

  • @anirbannandy9104
    @anirbannandy9104 Рік тому

    Definitely Like Your Work Bro......Your Explanation Rocks!!!!

  • @kaushik.aryan04
    @kaushik.aryan04 Рік тому +2

    I think because of this approach this should have been marked as hard problem.

  • @chandamwenechanya8614
    @chandamwenechanya8614 2 роки тому +1

    Hey neet, this is neat!

  • @sidazhong2019
    @sidazhong2019 9 місяців тому +1

    2 sum or sliding windows. Your false ideas were exactly what I was trying to do.

  • @ayushidalal5488
    @ayushidalal5488 Рік тому

    Hey, I'm new to this channel. I loved how you explained it so easily! Thanks :)

  • @mojedsamad7184
    @mojedsamad7184 Рік тому

    What if we wanted to know where or wich list entries give us this multiple?

  • @madhuj6912
    @madhuj6912 29 днів тому

    Can someone tell me whats this , what is x and n are that values of array " An integer x is a multiple of k if there exists an integer n such that x = n * k. 0 is always a multiple of k "

  • @beinghappy9223
    @beinghappy9223 3 місяці тому

    Amazing intuition

  • @mrunalajitjoshi1512
    @mrunalajitjoshi1512 Рік тому

    You got a new subscriber!!

  • @DJSTEVE42
    @DJSTEVE42 2 роки тому

    Does any one know why when we encounter a remainder that already exists in the hash map, there exists a sum that is %k ?

    • @dragonoid296
      @dragonoid296 2 роки тому +2

      because if the remainder wraps around, we know that it changed by k

  • @venkatasundararaman
    @venkatasundararaman 2 роки тому

    I have been watching your videos and May be it helped I don’t know but I had the same idea to solve the problem before seeing the solution 😃

  • @abhishekgururani6993
    @abhishekgururani6993 Рік тому

    Another way to handle the edge case when prefix sum will itself be a multiple of k, arr = [24,0,2] k = 6, [24,0] subarray sum is a multiple of 6. if(prefSum % k == 0 && idx > 0) return true;

  • @shikharathaur5179
    @shikharathaur5179 Рік тому

    Very well explained !

  • @mariotheguy123
    @mariotheguy123 7 місяців тому

    thank you neet

  • @ariaXP1
    @ariaXP1 2 роки тому +1

    Can you do 410. Split Array Largest Sum? Thank you!!

  • @rishabhraj8233
    @rishabhraj8233 Рік тому

    great explanation bro💗

  • @meetsoni1938
    @meetsoni1938 2 роки тому

    You made it very easy for me 🔥🔥💯

  • @vedbhanushali608
    @vedbhanushali608 Рік тому

    thanks, great intution.

  • @bhushanmahajan2150
    @bhushanmahajan2150 2 роки тому

    Could you please make videos on systems designs as well, if possible?

  • @masternobody1896
    @masternobody1896 2 роки тому +10

    me as a day of life an unemployed dude :(

  • @mattjm007
    @mattjm007 2 роки тому

    Well done on this video

  • @codeguru4
    @codeguru4 3 місяці тому +1

    hi @neetcode
    i Try to solve it Using Sliding Window It passes Most of the Test Csaes but if array consist of 0 then its failing 93/99 test cases are passed
    but this one if failing
    nums = [1,3,6,0,9,6,9]. , k = 7
    output : True
    if len(nums) < 2:
    return False
    currSum = 0
    totalSum =nums[0]
    l= 0
    for r in range(1, len(nums)):
    currSum = nums[l]+ nums[r]
    totalSum +=nums[r]
    if currSum % k == 0 or totalSum % k == 0 :
    return True
    l+=1
    if totalSum % k == 0:
    return True
    return False
    could you please See It Please

  • @avanishraj386
    @avanishraj386 Рік тому

    Could it be solved using Brute force method? If solved, then how?

  • @rajeevkri123
    @rajeevkri123 Рік тому

    Java solution for the same
    public boolean checkSubarraySum(int[] nums, int k) {
    HashMap map = new HashMap ();
    int sum = 0;
    map.put(0, -1);
    boolean found = false;
    int n = nums.length;
    for(int i=0; i< n; i++) {
    sum = sum + nums[i];
    int hash = sum % k;
    if(map.containsKey(hash)) {
    int diff = i - map.get(hash);
    if(diff>=2) {
    found = true;
    break;
    }
    } else {
    map.put(hash, i);
    }
    }
    return found;
    }

  • @anand.prasad502
    @anand.prasad502 Рік тому

    Thanks !

  • @ujjaldas9179
    @ujjaldas9179 3 місяці тому

    thanks

  • @vinayakhaunsnur1327
    @vinayakhaunsnur1327 Рік тому

    great solution

  • @mohamed_ellithy
    @mohamed_ellithy Рік тому

    AMAZING IDEA 😍🌹

  • @experiment0003
    @experiment0003 10 місяців тому

    Python is so easy for OA. Sadly, I'm more comfortable writing in Java. Imagine "remainder = { 0, -1 }". Java would be first import Map and hashMap, then Map remainder = new HashMap(); map.put(0, -1);. So sad. So so sad!

  • @vbcarnage
    @vbcarnage 2 роки тому

    i did not try it but it looks like this could be solved with segment trees

  • @yashpathak9285
    @yashpathak9285 2 роки тому +1

    You are so smart!! I would like to elect you president.

  • @santoshr4212
    @santoshr4212 Рік тому +2

    this should have been a hard problem.

  • @SaahasBuricha
    @SaahasBuricha 29 днів тому

    this is insane

  • @maheshjamdade1
    @maheshjamdade1 3 місяці тому

    This problem is mainly optimization.

  • @Dannnneh
    @Dannnneh 3 місяці тому

    Is there a real life use case for an algorithm for this?

  • @zz-yy-xx
    @zz-yy-xx 3 місяці тому

    OMG, so tricky!!!!!

  • @rahulbhardwaj4380
    @rahulbhardwaj4380 Рік тому +1

    Great concept but really this approach is difficult to come up with.

  • @heetshah7292
    @heetshah7292 2 роки тому

    I was recently asked this question in an interview and I was solving it through a two-pointer approach but I failed to optimize and got rejected 😥

  • @MDEMANURRAHAMAN-
    @MDEMANURRAHAMAN- Рік тому

    [5,0,0,0]
    3
    Expected output : True
    How can it possible ??

    • @jsalaat
      @jsalaat Рік тому

      0 and 0 are a continuous subarray hence making 0+0 = 0%k expects to fulfil the condition. hence returns true

  • @user-st2mq1wi5y
    @user-st2mq1wi5y 3 місяці тому

    Still unable to understand how it has checked all subarrays' sum

  • @kaioken1999
    @kaioken1999 Рік тому

    Dope

  • @imjusttryingtobesafelol5909

    i laughed when i saw the solution its sooooooo clever

  • @eddiej204
    @eddiej204 Рік тому +1

    How much IQ is required here to come up with the solution on the first look?

  • @youssefel-shabasy833
    @youssefel-shabasy833 3 місяці тому

    oh god

  • @charanpasupula3763
    @charanpasupula3763 2 роки тому

    Ninja level

  • @user-dp9gi1vg8r
    @user-dp9gi1vg8r Місяць тому

    yo, neetcode, bro, your solution doesn't work

  • @yatri6329
    @yatri6329 Рік тому

    Great yaar i was missing some cases ... thanks

  • @vijayanks1714
    @vijayanks1714 3 місяці тому

    why you need to add 0, -1
    TC; arr= [2,4,1] k = 2
    if you not add 0,-1 in map it return false
    at index 1 ==> 6 % 2 == 0
    index - map.get(0) >=2 ==> return true

  • @irarose3536
    @irarose3536 2 роки тому

    Thanks!

  • @olhabahatiuk6009
    @olhabahatiuk6009 2 роки тому

    Thanks!

    • @NeetCode
      @NeetCode  2 роки тому

      Thank you so much!!