Subarray Sum Equals K - Prefix Sums - Leetcode 560 - Python

Ғылым және технология

🚀 neetcode.io/ - A better way to prepare for Coding Interviews
🐦 Twitter: / neetcode1
🥷 Discord: / discord
🐮 Support the channel: / neetcode
Twitter: / neetcode1
Discord: / discord
⭐ BLIND-75 PLAYLIST: • Two Sum - Leetcode 1 -...
💡 CODING SOLUTIONS: • Coding Interview Solut...
💡 DYNAMIC PROGRAMMING PLAYLIST: • House Robber - Leetco...
🌲 TREE PLAYLIST: • Invert Binary Tree - D...
💡 GRAPH PLAYLIST: • Course Schedule - Grap...
💡 BACKTRACKING PLAYLIST: • Word Search - Backtrac...
💡 LINKED LIST PLAYLIST: • Reverse Linked List - ...
Problem Link: leetcode.com/problems/subarra...
0:00 - Read the problem
2:27 - Drawing Explanation
13:11 - Coding Explanation
leetcode 560
This question was identified as an interview question from here: github.com/xizhengszhang/Leet...
#prefix #sum #python
Disclosure: Some of the links above may be affiliate links, from which I may earn a small commission.

Пікірлер: 194

  • @beeramrahulreddy11
    @beeramrahulreddy113 жыл бұрын

    u forgot to add 2,1 to the hashmap

  • @TobiasWheaton

    @TobiasWheaton

    2 жыл бұрын

    Good catch, i was thinking about that too bc its easier to see the pattern if its consistent on when u add (even if its not needed for this example)

  • @prasad9012

    @prasad9012

    2 жыл бұрын

    I just spent like 10 minutes rewinding and forwarding the video trying to understand why 2 wasn't added. Thankfully, I found your comment now.

  • @dopark1027

    @dopark1027

    2 жыл бұрын

    Actually, it is just not {2:1}. He forgot to add the current sum to the hash table when it is not found in the table.

  • @amritkumar8876

    @amritkumar8876

    2 жыл бұрын

    Yup .. I was also thinking about that ..

  • @pwnweb5734

    @pwnweb5734

    2 жыл бұрын

    haha yeep. my OCD went brrrr... I was like wheres the 2 :P ..

  • @suvajitchakrabarty
    @suvajitchakrabarty4 ай бұрын

    If you are having difficulty understanding this or wrapping your head around the solution, maybe this might be a good way to think about it. The question asks how many subarray sum equals to k. For a subarray to sum to k, you need a subarray, as in a part of the array from index 'a' to index 'b' to have a sum equal to k. But when we reach any index 'b', we obviously do not know, if there was a subarray from index 'a' to index 'b' equal to k. However we do have the sums from 0 to index 'a' in our hash map, because we have been storing all sums starting from index '0' to every single index till now, and the count of them as the value of the key. Now obviously sum_0_to_a + sum_a_to_b = total sum so far (curSum). If we go to the original ask, which is we need a prefix that is sum_a_to_b to be equal to k. For that to hold true, replace sum_a_to_b with 'k'. Hence, sum_0_to_a + k = curSum. Hence curSum - k = sum_0_to_a. And then since we have been storing all possible values of sum_0_to_a so far in the hashmap, curSum - k must exist in the hashmap as a key, and we can simply add the value from the hashmap to add number of prefixes from 0 to any index which equalled to curSum - k .

  • @kimstuart7989
    @kimstuart7989 Жыл бұрын

    You know I remember first learning CompSci, I thought the specific algorithm concepts (BFS, DFS, Dijkstra, etc.) were the hard ones to learn. Now that I am more experiences, I realize that the what I thought then were 'basic' data structures, i.e. arrays, strings, etc. are actually the harder ones to make sure you understand because those concepts has many dedicated algorithms to them, such as Kadane, prefix/suffix array, KMP etc. that you need to know to truly understand that data structure. So while I glossed over arrays because I knew their functions, I am now revisiting to make sure I understand the algorithms embedded in them. Learning truly never does stop!

  • @fatcat22able

    @fatcat22able

    Жыл бұрын

    Honestly same here. I figured that arrays would be relatively simple, and they are simple on the surface, but there are so many algorithms and different types of problems that involve them that it feels like they're an entire rabbit hole unto themselves.

  • @Question418
    @Question4182 жыл бұрын

    I like your attempt to explain it, even though I don't fully understand it. I appreciate it.

  • @codetrooper9279

    @codetrooper9279

    Жыл бұрын

    U should

  • @ObaidullahGhawsi
    @ObaidullahGhawsi3 жыл бұрын

    Thanks, NeetCode for these solutions and explanations, It would be really helpful to make a video about general techniques that you use to solve these problems... Because we wan to know how to approcah these kinds of problems by ourselves. Thanks again.

  • @mangalegends
    @mangalegends Жыл бұрын

    I'm still trying to wrap my head around this EDIT: Came back a few weeks later and it makes 100% sense to me now

  • @timzhang6651
    @timzhang66512 жыл бұрын

    Well explained, and it takes effort to make a video as good as this. Thank you!

  • @scottloewke5199
    @scottloewke51992 жыл бұрын

    Good explanation and, fortunately, the omission of the [key = 2, count = 1] map entry did not affect the result. However, it would be good if NeetCode could add text at that part in the video to make it clear what happened.

  • @user-ib3ev5pl2t

    @user-ib3ev5pl2t

    4 ай бұрын

    It's not about a bug in the code, it's about a bug in the video. 9:55 Here you should have added key 2 and value 1 to the hashmap and that's it.

  • @josembass
    @josembass2 жыл бұрын

    Great explanation. How are we supposed to come up with a solution like this in 30m without having seen it before!

  • @darshana5254

    @darshana5254

    2 жыл бұрын

    We cannot. These are classic problems asked during interviews. Whoever come across this problem would easily solve it. Other would go with bruteforce approach which doesn't work on interviews.

  • @scionOfIkshvaku1

    @scionOfIkshvaku1

    2 жыл бұрын

    @@darshana5254 thanks bro, you’ve raised a very important point. Only if one has encountered such problems, only then will he be able to solve the problem cuz he knows how to optimum approach.

  • @mobaisi13

    @mobaisi13

    2 жыл бұрын

    That's the neat part. You don't.

  • @vineethsai1575

    @vineethsai1575

    2 жыл бұрын

    I got this question in the interview and I did not know the optimal solution. However I was able to produce the n^2 solution quickly and the interviewer started giving me hints to use Hashmap to reduce it to O(N). I scrambled here and there but was able to talk about the "repeated work" being done and how I could use hashmap to save the work. In the end I was not able to code it up. Interviewer still passed me though.

  • @calebmitcler8760

    @calebmitcler8760

    2 жыл бұрын

    @@vineethsai1575 what company

  • @apoorvwatsky
    @apoorvwatsky2 жыл бұрын

    1:55 I needed to hear that, I wanted to know why sliding window won't guarantee correct answer for these constraints. That cleared it up.

  • @CliffordFajardo
    @CliffordFajardo3 жыл бұрын

    Initially I thought it was a sliding window problem, Trying to wrap my head around this ...patience, time...ahhh. Thanks for the video!

  • @ziomalZparafii

    @ziomalZparafii

    Жыл бұрын

    I thought about it as a sliding window problem until I found out there can be negative values. If we would only have positive ones, you would increment right pointer while sum is less than k, then increment left while sume is more than k. That would be my approach (not tested).

  • @aleksandr_t

    @aleksandr_t

    Жыл бұрын

    @@ziomalZparafii the main problem behind sliding window approach is some edge cases. For example: [1,-1,0], k = 0 If we will use two pointers approach (or dynamic sliding window), then we will return 2 instead of 3. 1) sum=1, count=0, left=0, right=0 2) sum=0, count=1, left=1, right=1 3) sum=0, count=2, left=2, right=2

  • @ziomalZparafii

    @ziomalZparafii

    Жыл бұрын

    @@aleksandr_t you have a negative value in your array. Read my comment once again :-)

  • @matom2473

    @matom2473

    3 ай бұрын

    in a real interview we can not make this mistake, it will take you 20 mins to find out sliding window will not work

  • @RuslanZinovyev

    @RuslanZinovyev

    17 күн бұрын

    @@ziomalZparafii you still can use a sliding window with negative numbers, it depends on requirements and edge cases, so your first comment is not entirely accurate.

  • @darkwhite2247
    @darkwhite22475 ай бұрын

    08:21 - i have no idea how we are supposed to figure out during the coding interview that (0,1) has to be added into the hashmap by default. How is anyone solving this without memorizing during interviews? May be i'm dumb to not understand this even though the instructor is explaining it. Please help me understand the intution behind adding (0,1) in hashmap by default.

  • @user-ib3ev5pl2t

    @user-ib3ev5pl2t

    4 ай бұрын

    bcs if you find that n-k = 0 means that you dont need to remove anything so basically it be 0, 1 by default

  • @cranos666
    @cranos6662 жыл бұрын

    Crazy good explanation. Subscribed. Thank you man !

  • @SonGoku-lc1sb
    @SonGoku-lc1sb2 жыл бұрын

    Perfect explaination. The best one on youtube so far

  • @Retrosenescent
    @Retrosenescent2 жыл бұрын

    You explained it so perfectly that I didn't even need to see the code to be able to code it myself :) thank you!!

  • @tempregex8520
    @tempregex85202 жыл бұрын

    i appreciated you explaining this. But, it would have been more helpful(esp to people like me) where you would have taken the time to explain more about the use of HashMap for maintaining prefixSum -> Count to me it felt like the explanation went "too fast" as soon as you discussed the brute force solution.But, in any case a great attempt indeed.

  • @hoatruong2474
    @hoatruong24742 жыл бұрын

    Very informative man. Keep up the good work.

  • @ShivangiSingh-wc3gk
    @ShivangiSingh-wc3gk2 жыл бұрын

    Thank you so much!! Amazing walkthrough

  • @michelleyang1881
    @michelleyang18812 жыл бұрын

    really clear explanation. Thank you!

  • @arunraman6630
    @arunraman66302 жыл бұрын

    A slightly cleaner solution using a defaultdict class Solution: def subarraySum(self, nums: List[int], k: int) -> int: prefixSums = defaultdict(int, { 0 : 1 }) curSum = 0 res = 0 for n in nums: curSum += n res += prefixSums[curSum - k] prefixSums[curSum] += 1 return res

  • @zj82119
    @zj821192 жыл бұрын

    nice explanation with good diagram. really helpful.

  • @GdeVseSvobodnyeNiki
    @GdeVseSvobodnyeNiki Жыл бұрын

    Finally a great explanation what hashmap actually represents! Got the essentials of the algorithm on the first watch of this video, but was banging my head against the wall trying to figure it out on leetcode.

  • @smonkey001
    @smonkey0012 жыл бұрын

    Godlike explanation to a looked easy problem. Hats off my man

  • @unwarysage05w32
    @unwarysage05w32 Жыл бұрын

    This is a way better explanation than leetcode premium’s explanation thank you!

  • @Thewowhahahawow
    @Thewowhahahawow2 жыл бұрын

    What a god of prefix sums. Great vid!

  • @oscarchan5684
    @oscarchan56842 жыл бұрын

    Thank you for such a clear explanation!!!👍🙏

  • @edwardteach2
    @edwardteach22 жыл бұрын

    Another way to think about why we would set our key value to {0:1} instead of memorizing, is to think what if that single element, itself is the target. For example: input = [1, 1, 4] , k = 4 occur = { 0: 1 } By just eyeballing, you'll see the output is 1, since the last element is a 4. When we iterate through the input, we'll do input[2] - k (4 - 4) = 0. Do we have a 0 in our hashmap/dictionary? Yes we do, it's value is 1.

  • @alvjou

    @alvjou

    2 жыл бұрын

    except in this scenario wouldn't we be doing currSum - k (6 - 2) = 2, and we would be looking up the value for 2 in our hash map, which would be 1. I think your scenario only works if the single element that is the target is the first element in the input.

  • @benk2451
    @benk24516 ай бұрын

    Very well explained! Thank you so much!

  • @uzzwalpreetkaur3374
    @uzzwalpreetkaur3374Ай бұрын

    I understood this explanation! Thanks!! I was trying with sliding window technique first and getting the wrong answer until I realised that we can have negative numbers. This is indeed is a neat.

  • @sgetti4dinner
    @sgetti4dinner27 күн бұрын

    I see some confusion on why we initialize prefixSum = {0:1}, and that's because we can always produce 0 by taking no elements from our array (e.g. []). This works out nicely when we run into a subarray that has a sum == k, because sum - k = 0. Then the question we ask at this moment is "is there a prefix-subarray I can take away from my current subarray sum that also equals 0?" The answer is yes, because I can takeaway no elements from my current subarray and the current subarray sum will still equal k.

  • @lakcai4063
    @lakcai4063 Жыл бұрын

    This is probably the best explanation of this question on KZread

  • @vatsalsharma5791
    @vatsalsharma57913 жыл бұрын

    Awesome explanation❤️ Can you plz solve Count submatrices with all ones?

  • @daylansit4537
    @daylansit45372 жыл бұрын

    By far the best explanation to this problem

  • @razisyed9481
    @razisyed94812 жыл бұрын

    Amazing explanation--thank you!

  • @dharmvtiwari6286
    @dharmvtiwari62863 ай бұрын

    There is another edge case for adding 0->1in the starting , which is if the. nums[0] is 0. This intuition is quite tricky but great explanation.

  • @user-xo7hl7gs2d
    @user-xo7hl7gs2d9 ай бұрын

    Very nice & clear. TY!

  • @X3Maverick
    @X3Maverick21 күн бұрын

    00:40 The brute force approach is O(n^3), not O(n^2). There are ~n^2 subarrays but summing a subarray is O(n).

  • @soanonso
    @soanonso Жыл бұрын

    Really good explanation. Thanks.

  • @seongmoon6483
    @seongmoon6483 Жыл бұрын

    Great explanation, and a really smart solution

  • @meylyssa3666
    @meylyssa36664 ай бұрын

    thank you so much for you clear explanations!

  • @chenhaibin2010
    @chenhaibin20102 жыл бұрын

    brilliant trick of adding a prefix 0 to count no prefix situation instead of another if statement

  • @rajdeepchakraborty7961
    @rajdeepchakraborty79613 жыл бұрын

    Explained well 👍

  • @jameszhang9422
    @jameszhang9422 Жыл бұрын

    Thank you for the great video!

  • @celinlu7274
    @celinlu72742 жыл бұрын

    Your video is much better than the video in leetcode solution. Thank you.

  • @shaon6996
    @shaon69962 жыл бұрын

    Great explanation!

  • @almasabdrazak5089
    @almasabdrazak50893 жыл бұрын

    so what you are saying is we have a map that shows how many ways we can come up with given sum so for sum 0 we can come up with 2 sequences, but these sequences have to be contiguous , how to prove that 0 has 2 only if we pop up contiguous elements from current sum ?

  • @jameszhang9422
    @jameszhang94224 ай бұрын

    Very clear explanation! Even better on the second watch lol.

  • @AbhishekJaiswal24
    @AbhishekJaiswal242 жыл бұрын

    Thanks neetcode !!!

  • @nivethanyogarajah1493
    @nivethanyogarajah14933 ай бұрын

    Very nice explanation!

  • @MP-ny3ep
    @MP-ny3ep Жыл бұрын

    Hands down the best coding youtube channel

  • @shrimpo6416
    @shrimpo64162 жыл бұрын

    great explanation!!!

  • @jorgemejia1586
    @jorgemejia1586 Жыл бұрын

    thanks bro I needed this

  • @santiagolimas2014
    @santiagolimas20142 жыл бұрын

    Thank you!

  • @itachijonin
    @itachijonin2 жыл бұрын

    really good explanation. my one nit is that you should make your code more pythonic (camel-casing?!)

  • @AmolGautam
    @AmolGautam8 ай бұрын

    Thank you so much for this.

  • @algorithmo134
    @algorithmo1343 жыл бұрын

    @NeetCode can you do 1462. Course Schedule IV? It is similar to the question you did before please thank you!

  • @fengliu975
    @fengliu9752 жыл бұрын

    Did this problem but used an array to keep track of the running totals then reversed it... used a deque after but wow is deque slow and memory intensive

  • @Obligedcartoon
    @Obligedcartoon2 жыл бұрын

    This is a LC hard imo, gawd damn!

  • @NeetCode

    @NeetCode

    2 жыл бұрын

    Agree, it's definitely more difficult than some actual hard problems.

  • @cbverma2k
    @cbverma2k2 жыл бұрын

    Super like and well explained

  • @mikhassik
    @mikhassik7 ай бұрын

    Neetcode's videos are usually the ones that drive it home

  • @Mohith7548
    @Mohith7548 Жыл бұрын

    I don't know why it works, but still works! ;) Everytime I have to revisit the solution before interview. ;(

  • @orellavie6233
    @orellavie62332 жыл бұрын

    I am not sure, but take an example where the array is [-1,1,-1] and k>0(e.g., 2). The result would be 1, since after the 1 is covered, and then we went into the -1 again, the result will be 1, and that's not true (should be 0). Am I missing something? I think the results should be added only if the cursum is >=k

  • @vinethasuresh3488
    @vinethasuresh3488 Жыл бұрын

    Thanks for this video sir , it helped a lot.

  • @NeetCode

    @NeetCode

    Жыл бұрын

    Happy to help!

  • @4r4zzz
    @4r4zzz9 ай бұрын

    Thanks a lot

  • @edwardteach2
    @edwardteach22 жыл бұрын

    My python implementation: class Solution(object): def subarraySum(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ occur = collections.defaultdict(int) occur[0] = 1 count = 0 cur_sum = 0 for n in nums: cur_sum += n if cur_sum - k in occur: count += occur[cur_sum-k] occur[cur_sum] += 1 return count

  • @dipeshbhardwaj1747
    @dipeshbhardwaj1747 Жыл бұрын

    Hi @NeetCode. I am not able to understand the part where you say. we need to add the prefix sum to Hashmap simultaneously. even if are maintaining the Hashmap first. we can still get count of prefix - k and prefix = k.

  • @anandmehrotra6170

    @anandmehrotra6170

    Жыл бұрын

    Take this example: [1]; k = 0. Without adding first your prefix sum array would be: 0->1 and 1->1. Now you will compute prefixSum-k for each key. 0 - 0 = 0, You say you have a match(which is just the empty prefix). Now you compute 1- 0 = 1, you check your map and the value exists, so you return a count of 2. That is why the update needs to happen simultaneously. So, that you can check the subarray between some starting index "i" and current index "k"(excluding k). Hope this makes sense.

  • @aadil4236
    @aadil42362 жыл бұрын

    10:02 Why didn't we add 2 as a prefix there? Was that a mistake on your part? I'm confused.

  • @andrewsowell3088

    @andrewsowell3088

    2 жыл бұрын

    Yep, should have been added

  • @TheK1KoS
    @TheK1KoS2 жыл бұрын

    Just failed this one in an interview. I just don't get it even when with such detailed explanation

  • @phebos2228
    @phebos2228 Жыл бұрын

    Bless you, O savior from heavens above!!

  • @mike0998unstopable
    @mike0998unstopable2 жыл бұрын

    Wayyyy less confusing than the explanation on leetcode

  • @ryanc7840
    @ryanc78402 жыл бұрын

    Thank U. A huge kudos!

  • @NeetCode

    @NeetCode

    2 жыл бұрын

    Glad it helped!

  • @asdfasyakitori8514
    @asdfasyakitori8514 Жыл бұрын

    Great video

  • @thegod3500
    @thegod35009 ай бұрын

    Finally some decent explanation of this magic

  • @ROFEL
    @ROFEL2 жыл бұрын

    Do the next harder version of this which is Continuous Subarray Sum 523

  • @m04d10y1996
    @m04d10y1996 Жыл бұрын

    Why did you initialised your dictionary before hand with (0:1)

  • @fahadahmedakash8045
    @fahadahmedakash80457 ай бұрын

    You're awesome!

  • @gorilla4870
    @gorilla48702 жыл бұрын

    Simple problem, but can be quite confusing to explain. You explained it very well Neet. Thanks a lot!

  • @emekaobasi4765
    @emekaobasi4765 Жыл бұрын

    why do we add to the hashMap after checking for diff? Can we add to the hashMap after checking for diff?

  • @siriussem2
    @siriussem29 ай бұрын

    yey first real english guide!

  • @Rancha51
    @Rancha51 Жыл бұрын

    I feel bad for watching solutions, but I don't know what else to do

  • @labi9500
    @labi95002 жыл бұрын

    thanks!

  • @ygwg6145
    @ygwg6145 Жыл бұрын

    It appears easier to use hash table cum->deque[index]. It did pass all the tests.

  • @divyanshmishra5121
    @divyanshmishra51219 ай бұрын

    I have a doubt. If the array is 6,4,3 and k is 9. we find that sum till n is 13 and 13-k ie 13-9=4 is present in the array so that will get counted but in reality it is wrong as it is not a subarray is we dont pick contiguous element. please explain

  • @slayerzerg
    @slayerzerg Жыл бұрын

    get() is unnecessary can just add to hashmap regularly. this drawing analysis is goated though!!!

  • @ngndnd
    @ngndnd7 ай бұрын

    i think im just dumb af bc i still dont understand it

  • @nachiket9857
    @nachiket98577 ай бұрын

    brilliant

  • @hoatruong2474
    @hoatruong24742 жыл бұрын

    oh lord it's so cool. Really nice

  • @rajdeepchakraborty7961
    @rajdeepchakraborty79613 жыл бұрын

    Your channel is really underrated man 😢

  • @TokyoXtreme

    @TokyoXtreme

    2 жыл бұрын

    Truth.

  • @harveyspector1463
    @harveyspector14632 жыл бұрын

    man I love this explaination, couldnt have made it any more dumber for me. Thank you very much

  • @odelyaholiday9519
    @odelyaholiday95199 ай бұрын

    It's easier to use defaultdict instead of the .get

  • @chilly2171
    @chilly21712 жыл бұрын

    9:04, shouldn't it be 3 instead of -3? since you need to add 3 to 0 to form K.

  • @ritikajaiswal3824
    @ritikajaiswal38242 жыл бұрын

    Please solve 1151 minimum swaps to group all 1's together

  • @balajipattabhiraman
    @balajipattabhiraman2 жыл бұрын

    No way anyone can come up with this in an interview

  • @harishsn4866
    @harishsn4866 Жыл бұрын

    I have watched at least 50 of your videos and this is the only one I found difficult to understand. Nevertheless, thank you for your content.

  • @firomsamt7642
    @firomsamt76425 ай бұрын

    damn this question is much harder than i thought thank you for the explanation tho

  • @huangCAnerd
    @huangCAnerd3 ай бұрын

    How does this solution prevent subarrays that sum up to k from being counted more than once? I don't get it.

  • @Alexis-ym9ph
    @Alexis-ym9ph Жыл бұрын

    How feasible would it be to solve this kind of problem at the interview, given you never seen the solution before?

  • @sinceretuitt1865
    @sinceretuitt18655 ай бұрын

    This is so elegant

  • @user-dp9gi1vg8r
    @user-dp9gi1vg8r Жыл бұрын

    super cool

  • @AliMalik-yt5ex
    @AliMalik-yt5ex Жыл бұрын

    I'm even more confused than I was before I saw this video.

Келесі