DP 43. Longest Increasing Subsequence | Binary Search | Intuition

Sdílet
Vložit
  • čas přidán 11. 07. 2024
  • Lecture Notes/C++/Java Codes: takeuforward.org/dynamic-prog...
    Problem Link: bit.ly/3rVoIoq
    Please watch the video at 1.25x for a better experience.
    Pre-req for this Series: • Re 1. Introduction to ...
    a
    Make sure to join our telegram group for discussions: linktr.ee/takeUforward
    Full Playlist: • Striver's Dynamic Prog...
    In this video, we solve the Longest Increasing Subsequence problem using Dynamic Programming
    If you have not yet checked our SDE sheet, you should definitely do it: takeuforward.org/interviews/s...
    You can also get in touch with me at my social handles: linktr.ee/takeUforward

Komentáře • 368

  • @takeUforward
    @takeUforward  Před 2 lety +200

    let me know in the comments, if this blew your mind or not :P

    • @prathamchoudhary6244
      @prathamchoudhary6244 Před 2 lety +1

      Great explanation!

    • @jaideepsingh7955
      @jaideepsingh7955 Před 2 lety +9

      Sir in amazon online interview, is it like leetcode where we have to complete a given function only, or we have to do all the input/output, construct trees/graphs etc. also ?

    • @Superheroic_Anime
      @Superheroic_Anime Před 2 lety +2

      Mind blowing bhaiya

    • @ShivaniSinghYadav-sm3ee
      @ShivaniSinghYadav-sm3ee Před 2 lety +6

      My mind flew away and now I am chasing it 😌🥴

    • @KapilKumar-ig6df
      @KapilKumar-ig6df Před 2 lety +1

      lower_bound returns an iterator. How your code compiled by returning an index?

  • @-harshayadav
    @-harshayadav Před 2 lety +28

    in java it returns the index of the search key, if it is contained in the array. otherwise, (-(insertion point) - 1). The insertion point is defined as the point at which the key would be inserted into the array: the index of the first element greater than the key.
    int pos=Collections.binarySearch(temp,arr[i]);
    if(pos

  • @gaurishukla9177
    @gaurishukla9177 Před 2 lety +13

    Dude you were the only one who could explain why this worked!! loved it!!

  • @Joselson14
    @Joselson14 Před 7 měsíci +4

    This has been the most succinct explanation that I could find on CZcams. Thank you so much for your dedication.

  • @rishika6525
    @rishika6525 Před 2 lety +2

    thanks for giving the intutution behind, really makes the solution more meaningful, rather than feeling like we just gotta cram it

  • @CostaKazistov
    @CostaKazistov Před rokem +12

    Perfect explanation of the intuition behind this solution.
    Nice work! 👍👍

  • @NARUTOUZUMAKI-bk4nx
    @NARUTOUZUMAKI-bk4nx Před 6 měsíci

    Understood, Thanks for providing every possible intuition for Longest Increasing Subsequence

  • @dhanashreegodase4445
    @dhanashreegodase4445 Před 2 lety +57

    i don't know why ppl leave videos like this wdout giving a like. there are currently 8k+ views and only around 400 likes. btw awesome content !!!!!!!!!thanks

    • @parthsalat
      @parthsalat Před rokem +1

      Some men just want to watch the world burn 🔥

    • @parvathipillaiii
      @parvathipillaiii Před dnem

      and now its 172K views and 6.4k likes loml

  • @Abhishek-yy3xg
    @Abhishek-yy3xg Před 2 lety +44

    Java Solution:
    static int longestSubsequence(int size, int arr[])
    {
    // using binary search
    ArrayList ans = new ArrayList();
    ans.add(arr[0]);
    int len = 1;
    for (int i = 1; i < size; i++) {
    if (arr[i] > ans.get(ans.size() - 1)) {
    ans.add(arr[i]);
    len++;
    } else {
    int indx = binarySearch(ans, arr[i]);
    ans.set(indx, arr[i]);
    }
    }
    return len;
    }
    static int binarySearch(ArrayList ans, int key) {
    int low = 0;
    int high = ans.size() - 1;
    while (low

  • @AnkitJosh
    @AnkitJosh Před rokem +3

    thank you ! the intuition was very helpful. for anyone looking to generate the actual sequence you can't do it using binary search. You would need a segment tree !

  • @sameersahu4569
    @sameersahu4569 Před 2 lety +2

    The concept of lower bound was so amazing...Thank you

  • @yogeshvishwakarma596
    @yogeshvishwakarma596 Před 2 lety +11

    code:
    int lengthOfLIS(vector& nums) {
    vector temp;
    temp.push_back(nums[0]);
    for(int i(0);i temp.back()){
    temp.push_back(nums[i]);
    }else{
    int ind = lower_bound(temp.begin(),temp.end(),nums[i]) - temp.begin();
    temp[ind] = nums[i];
    }
    }
    return temp.size();
    }

  • @stith_pragya
    @stith_pragya Před 6 měsíci +1

    UNDERSTOOD............Thank You So Much for this wonderful video.......🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻

  • @rishabhthakur7494
    @rishabhthakur7494 Před rokem +19

    At 11:15 the 2 will come after 1,even though nothing will change,just reminding.

    • @aeroabrar_31
      @aeroabrar_31 Před rokem +12

      You know what , I just paused at this timestamp and came into the comment section to find whether i was the only one who spotted the mistake and found your comment.

    • @samratgupta731
      @samratgupta731 Před rokem

      @@aeroabrar_31 +1 mate

    • @vivekvardhankaranam2027
      @vivekvardhankaranam2027 Před 22 dny

      i think 4 after that 1 has to be changed

  • @kolawoleabdulrahman
    @kolawoleabdulrahman Před 8 měsíci

    awesome content. the only binary search approach I could find online as well and i understood. great video

  • @vishalvishwakarma1760
    @vishalvishwakarma1760 Před 2 lety +1

    MIND BLOWING MAN! LOVED THE EXPLANATION.

  • @sagarmittal8627
    @sagarmittal8627 Před 2 lety +1

    This method is so good !! Much better TC and SC with such a short code !

  • @vikashkumar7762
    @vikashkumar7762 Před 2 lety +4

    Intution is superb... And Striver choice question is awesome :)

  • @anshverma2921
    @anshverma2921 Před 8 měsíci +1

    so sorry for my words but this optimization is so fucking good. Seriously, so many approches for a single question damm. honestly sir if u want u can just give the best approch and finish it but u r taking us step by step and make us undersatnd the actuall concepts. i m following ur playlist from the starting but after this question not able to stop myself from getting jump into the cmnt box. Really thank u sir for such a best ever playlist.

  • @sarthakjohnsonprasad3909
    @sarthakjohnsonprasad3909 Před 3 měsíci

    Striver, trust me you have insane explanation skills.

  • @kartikey3695
    @kartikey3695 Před 2 lety +76

    For those who are wondering how is 'ind' calculated :-
    ind = lower_bound(temp.begin(),temp.end(),arr[i]) - temp.begin();

    • @harshkushwaha5052
      @harshkushwaha5052 Před 2 lety +3

      thanks bro u saved my time

    • @arunabhgupta9082
      @arunabhgupta9082 Před 2 lety +4

      you can also use
      auto ind = lower_bound(temp.begin(),temp.end(),arr[i]);
      *ind = nums[i];

    • @mrigankshigupta9859
      @mrigankshigupta9859 Před rokem

      can you please explain this line of code ?

    • @user-fz9ye6yk9y
      @user-fz9ye6yk9y Před rokem

      @@mrigankshigupta9859 basically you used auto to declare i, so it returns an iterator. *i is to approach the value where i points at.

    • @meetabhashiniparida9417
      @meetabhashiniparida9417 Před rokem

      can u just explain me why at 11:09 we overwrite 1 with 2...that wont become a subsequence then right?

  • @DivyaKumari179
    @DivyaKumari179 Před 12 dny +1

    Understood!!!
    Thanks for this amazing series 🎉

  • @ananyagupta1409
    @ananyagupta1409 Před 4 měsíci +1

    This was really well made !! Kudos!!!

  • @Zasyg
    @Zasyg Před rokem +13

    For all the java peeps out there
    Use this function instead of lower bound
    static int ceil(int key, List lst){
    int low = 0 , lst = lst.size() - 1;
    int ans = -1;
    while(low

    • @satyamgupta1446
      @satyamgupta1446 Před rokem +2

      int l = 0 , h = li.size() - 1;
      while(lnums.get(mid)) l=mid+1;
      else h=mid-1;
      }
      return l

  • @soumyakantigiri
    @soumyakantigiri Před 2 měsíci

    Wow, the only place where I need to come back since no other place helps me with the intuition.

  • @deepakbhoria4172
    @deepakbhoria4172 Před 8 měsíci

    Awesome video by Striver as always!!! Java also has ceiling methods for TreeSet, TreeMap. Because we are inserting in such a way sequence is kept increasing even after deletion and reinsertion, below will get accepted as well:
    public static int longestIncreasingSubsequence(int arr[]) {
    //Your code goes here
    TreeSet myset = new TreeSet();
    myset.add( arr[0] );
    for( int i = 0; i < arr.length; i++ ){
    if( arr[i] > myset.last() ){
    myset.add( arr[i] );
    } else {
    //Map.Entry entry = myset.ceilingEntry( arr[i] );
    Integer ceilValue = myset.ceiling( arr[i] );
    if( ceilValue != arr[i] ){
    myset.remove( ceilValue );
    myset.add( arr[i] );
    }
    }
    }
    return myset.size();
    }

  • @anshulagarwal6682
    @anshulagarwal6682 Před rokem

    Very good series in which we solve a same question by different methods.

  • @user-yc2lm3mr3m
    @user-yc2lm3mr3m Před měsícem

    Awesome explanation bro, thanks❤

  • @Tunbumbum
    @Tunbumbum Před 7 měsíci

    great explanation I love it, thank you sir

  • @DevashishJose
    @DevashishJose Před 5 měsíci

    Understood, thank you so much.

  • @varunsharma1889
    @varunsharma1889 Před 2 lety +1

    Great explanation. And also credit to people who invented and came up with this idea 💡. That's tough.

  • @mohammadyahya78
    @mohammadyahya78 Před 4 měsíci

    Wow your explanation is super

  • @muditkhanna8164
    @muditkhanna8164 Před 9 měsíci

    the most perfect N log N solution out there for LIS.

  • @d_0364
    @d_0364 Před dnem

    another O(nlogn) approach, kind of intuitive:
    Note: first do the space optimization using only one array (only *dp* and not *dp* with *cur* ) and analyze how the table is getting filled.
    make a duplicate array of pair {nums[i],i} and sort them. Lets name this array arr2. Now, the dp table is filled with "i" going n -> 0 as dp(prev) = max( dp(prev), 1+dp(i)) which essentially means that any number less than number at current index "i" will take its max i.e. { arr[i] > arr[prev] } and { i > prev } are the two conditions and then we can do dp[prev] = max(dp[prev], 1+dp[i]). thus we find the lower_bound of the current element arr[i] in arr2 and since arr2 is sorted, we go to all elements to left side of the lower_bound of arr[i]. as arr2 has size n and we are finding each arr[i] using binary search, this makes the complexity O(nlogn). Sorting also takes O(nlogn) so overall it works in O(nlogn).

  • @piyushsaxena7399
    @piyushsaxena7399 Před 2 lety +30

    the explanation is soooooooooooo goood, im really enjoying your dp series. i understand everything easily and enjoy it a lot. u make learning these concepts so easy to remember. thanks a lot

  • @andreasleonidou3620
    @andreasleonidou3620 Před rokem +1

    Great explanation! Well understood, thanks!!

  • @ronakslibrary8635
    @ronakslibrary8635 Před rokem

    Thanks for letting me know thre concept of Upper Bound and lower bound

  • @rishav144
    @rishav144 Před 2 lety +1

    Great explanation ...pls continue like this

  • @singleslit2024ICPCgrind
    @singleslit2024ICPCgrind Před 2 měsíci

    thank you Striver:)

  • @codingp110
    @codingp110 Před měsícem

    Bhaiya tussi great ho!

  • @cinime
    @cinime Před rokem

    Understood! Thank U so much as always!!

  • @SurajVT
    @SurajVT Před rokem +2

    Java guys can use TreeSet from the Collection framework.
    // Code
    public int lengthOfLIS(int[] nums) {
    TreeSet ts = new TreeSet();
    ts.add(nums[0]);

    for(int i=1; i

  • @prashantmishra-yw4xu
    @prashantmishra-yw4xu Před 4 měsíci

    great intuition striver

  • @gunduboinadileep9523
    @gunduboinadileep9523 Před 7 měsíci

    understood!!!

  • @coding8000
    @coding8000 Před 2 lety

    Understood, thank you sir, you are god to me , I worship striver Everyday. thanks.

  • @utkarshkhairnar371
    @utkarshkhairnar371 Před 2 lety +1

    No need to update the temp if the index we got by lower_bound is not n-1,right?

  • @the.stupid07
    @the.stupid07 Před 6 měsíci

    good explanation 👍👍👍

  • @Tejaswita872
    @Tejaswita872 Před 6 měsíci

    Nice explanation

  • @daumtto
    @daumtto Před 7 měsíci

    Dude ur the best

  • @tarunsahu2365
    @tarunsahu2365 Před rokem

    what a great explanation simply loved it

  • @no---on
    @no---on Před 6 měsíci

    If I want to print the subsequence then how I can do this, the subsequence is changing and we are inserting the new element into a vector which is actually not a subsequence. I got the approach for finding but if i have to print it then ?

  • @ratinderpalsingh5909
    @ratinderpalsingh5909 Před 11 měsíci

    Understood, sir. Thank you very much.

  • @gamengoaituyen4432
    @gamengoaituyen4432 Před rokem

    that so useful, i have got the hang of its working after watching this video

  • @hiteshmehra361
    @hiteshmehra361 Před 9 dny +1

    Is there any proof for binary search replacement method that it will not affect the LIS length?

  • @prabhakaran5542
    @prabhakaran5542 Před 2 měsíci +1

    Understood ❤

  • @3darpan
    @3darpan Před rokem

    Striver, this is just perfect !

  • @kamleshsinghbisht5569
    @kamleshsinghbisht5569 Před 11 měsíci

    The concept of array could also be understood in this manner:
    Basically the ith element of temp array means that the longest increasing subsequence whose greatest element is temp[i] has a length of i+1.
    In the Algorithm what we are basically doing is that we are replacing the current element with it's best place in temp vector.
    By best place I mean that the place at which current element is the greatest element in the longest increasing subsequence.
    Let the index of that best place be ind(0 based indexing).
    Then ind+1 is the length of the longest increasing subsequence whose greatest element is the current element.

  • @shivisingh9975
    @shivisingh9975 Před 2 měsíci

    Understood!

  • @rushikeshdeshpande8809

    I was searching for this explanation everywhere

  • @lakeshkumar1252
    @lakeshkumar1252 Před rokem

    thanks for the easy and awesome explanation sir

  • @l047vedanglokhande3
    @l047vedanglokhande3 Před rokem

    Was looking for this approach 😱👍

  • @RohitKumar-dy2gc
    @RohitKumar-dy2gc Před 7 měsíci

    amazing

  • @meenakshiyadav7471
    @meenakshiyadav7471 Před rokem

    no one can teach like you sir

  • @gagankainthola8454
    @gagankainthola8454 Před měsícem +1

    i feel this approach in not at all intuitive but thanks for the explanation bhaiya:)

  • @UECAshutoshKumar
    @UECAshutoshKumar Před 14 dny +1

    Understood!!!

  • @sayandey1131
    @sayandey1131 Před rokem +6

    Just a small correction: lower_bound() gives index of first element which is greater than or equal to the target element. For getting index of 1st element, strictly greater than target element, we need upper_bound(). Anyway, great video as ever 🔥

    • @satvrii
      @satvrii Před rokem

      No bro, lower bound hi hoga

    • @ujjawalraj6096
      @ujjawalraj6096 Před rokem +2

      Haan to lower bound is we all required if the element is present then we have to replace with the same elements if not then find first greater one

  • @AnkitVerma-yn3ku
    @AnkitVerma-yn3ku Před 3 měsíci

    The intuition behind the binary search lies in the fact that we replace considerably bigger elements with smaller ones with the possibility that there are high chances that smaller elements will be smaller than upcoming bigger elements thereby forming LIS as compared to relatively existing bigger elements having possibility of being smaller than upcoming new elements meanwhile also maintaining max LIS list length up to some index i.

  • @yashchawla3729
    @yashchawla3729 Před 2 lety

    Osm explanation keep making this kind of videos

  • @dhruvalkushwaha5132
    @dhruvalkushwaha5132 Před 2 lety +5

    I think we have to use an iterator for "ind" here because lower_bound will not return the index as int here. Can anyone clarify this?

    • @takeUforward
      @takeUforward  Před 2 lety +12

      We can subtract first iterator to get index

  • @pranoymukherjee3319
    @pranoymukherjee3319 Před 2 lety

    This is the best intuition I have ever seen for LIS using BS, code and explaination is everywhere but intuition 🔥🔥

  • @immortal6978
    @immortal6978 Před 7 měsíci

    Understood bro

  • @vishious14
    @vishious14 Před 6 měsíci

    Understood.

  • @verma_jay
    @verma_jay Před 8 měsíci

    understood

  • @soubhikghosh6564
    @soubhikghosh6564 Před 7 měsíci

    Hi can anyone tell me if its possible to print LIS in o(nlogn) ? If yes, then how should the code look like?

  • @rishabhgupta9846
    @rishabhgupta9846 Před rokem

    understood,great series

  • @learner2027
    @learner2027 Před 2 lety

    in java , I make a separate function for the binary search instead of using the inbuild Arrays.binarySearch(). But I am getting TLE . Why so ? Is there anyone who are also getting this issue like me ?

  • @anukulgaurav3043
    @anukulgaurav3043 Před 2 lety +1

    this is mind blowing striver:)

  • @saiyamsachdeva3354
    @saiyamsachdeva3354 Před rokem

    bhaiya java me toh stl n hota toh humko lowerbound and upperbound ka code likhna padega??

  • @dheerajshukla7008
    @dheerajshukla7008 Před 11 dny

    understand sir

  • @ganeshkamath89
    @ganeshkamath89 Před 2 lety

    Thanks Striver. Understood.

  • @SuyashSoni248
    @SuyashSoni248 Před rokem +1

    Not working for [0, 1, 0, 3, 2, 3], Expected: 4 Actual: 3

  • @lakshaygupta5911
    @lakshaygupta5911 Před rokem +1

    really good explanation 😃

  • @rimpiranibaruah7922
    @rimpiranibaruah7922 Před 7 měsíci

    DOUBT If for arr={1,7,8,4,5,6,-1,9} say we are at i = 4, arr[i] = 5 and our temp is {1,4,8}..Now for comparing 5 in temp when we use lower_bound the range is [first, last) last not included..So isn't the comparison from temp.begin() to temp.end()-1? Since last is not included in the range.

  • @shivasai7707
    @shivasai7707 Před rokem +1

    This is more like greedy we try to keep minimum values in lis so list can expand
    awesome explanation as always

  • @nihalsingh6233
    @nihalsingh6233 Před 9 měsíci

    Understood

  • @ujjalsaha428
    @ujjalsaha428 Před 2 lety

    As always "understood" ❤️

  • @dreamyme543
    @dreamyme543 Před 6 měsíci

    Understood:)

  • @creature274
    @creature274 Před rokem

    Why temp array is not the lis and why it is only length of longest lis??

  • @marufhasanmunna8193
    @marufhasanmunna8193 Před 2 lety

    Love you bhai..
    From Bangladesh..

  • @JAY-rm8pj
    @JAY-rm8pj Před 2 lety +7

    Firstly a lots of thanks for delivering such an amazing content in an understandable way....
    But one doubt...how does such intuition strikes to anyone while solving such questions...coz if this intuition strikes to anyone then it means that he is as equal as...a researcher/expert who has already developed such an algorithm for this question....

    • @rajeshsingh-mv7zn
      @rajeshsingh-mv7zn Před rokem

      You can't form this solution in a 40min interview, if you've not seen it earlier

  • @varunaggarwal7126
    @varunaggarwal7126 Před rokem +1

    at 14:57, I think The size() function does not recalculate or iterate over the elements each time it is called, so it has a constant time complexity.

    • @gauravtiwary1839
      @gauravtiwary1839 Před rokem

      Yes, the size() function for a std::vector in C++ has a time complexity of O(1).

    • @muditkhanna8164
      @muditkhanna8164 Před 9 měsíci

      @@gauravtiwary1839 i've been programming for 4 years and i didn't knew that the size function has 0(1) TC. can you please share the algo for size function.
      I can understand what if a vector is already initialised
      for ex:
      vectorvec={1,2,3,4,5,6,7,8,9};
      is vec.size(); 0(1)tc here also?

  • @YeaOhYeahh
    @YeaOhYeahh Před 7 měsíci

    daaamnnn🔥

  • @halchal41
    @halchal41 Před 11 měsíci

    This algo of finding longest increasing subsequence by BINARY SEARCH is call patience sorting algorithm.

  • @engineeroncamera8711
    @engineeroncamera8711 Před rokem

    Understooooooooooooooooooooooooooood!!!!!!!!!!!!!!!!

  • @dineshchintu9779
    @dineshchintu9779 Před 2 lety

    helped a lot :)

  • @googleit2490
    @googleit2490 Před 7 měsíci

    DP Revision :
    Uff bhai, how can I even forget this solution ;-;
    Had to watch the previous two videos too, to get to the O(N) solution ;-;
    Nov'20, 2023 03:30 pm
    (Happy Birthday to me... ;))

  • @harrybhakt6020
    @harrybhakt6020 Před 2 lety

    Amazing 👌👌

  • @prathamchoudhary6244
    @prathamchoudhary6244 Před 2 lety +2

    I have been following this series right from the beginning and found it to be the best on youtube . Thank you striver for this awesome playlist.

  • @user-dj5qq6mf4w
    @user-dj5qq6mf4w Před 6 měsíci

    can someone please give the brute force approach for this problem which he's explaining in the solution

  • @m-bk4um
    @m-bk4um Před 7 měsíci

    understand