二分查找为什么总是写错?

Поделиться
HTML-код
  • Опубликовано: 26 ноя 2024

Комментарии • 79

  • @haodongwu1313
    @haodongwu1313 2 года назад +5

    真的牛! 之前都是每做一道二分法就得记他的特殊处理方式,但这个模板是真的适用所有问题而且通俗易懂!受教了!!

  • @youtube1o24
    @youtube1o24 2 года назад +14

    讲得太好啦 实际处理中希望能把m换乘L+(R-L)/2 这样可以避免overflow👍👍👍

    • @jerrylin4980
      @jerrylin4980 2 года назад +1

      對 雖然overflow不常遇到 但我平常都直接這樣寫以免忘記

  • @supercoko
    @supercoko Год назад +1

    太强了, 看别的讲解, 好多都是炫技, 写的很难懂, 但大佬这个非常好理解, 也更加泛用.

  • @jiachengwang3085
    @jiachengwang3085 6 месяцев назад

    太厉害了,把二分查找法讲明白了,整个原理的解惑也做的特别好!

  • @IchibanIce
    @IchibanIce Год назад +2

    This is the best binary search tutorial I've seen! Thanks a lot!

  • @80kg
    @80kg 3 года назад +2

    This explanation is so clear and very helpful for special types of binary search problems like LC 275

  • @qiaoyiliu2396
    @qiaoyiliu2396 Год назад

    这个真的是我看到讲的最好的视频!

  • @Leo-zh2or
    @Leo-zh2or 3 года назад +1

    好棒啊。终于找到一个能把二分法说得这么直观易懂通用。

  • @daily2432121
    @daily2432121 Год назад

    讲的非常清楚。蓝红区域划分的思路很好

  • @Charles-rn3ke
    @Charles-rn3ke 3 года назад +1

    这么优质的频道才一百多个关注。

  • @huilinghuang2693
    @huilinghuang2693 Год назад +1

    不用这么复杂, 只要记住每次改变left 或者right,不要把target踢掉。 while循环体内比较的时候,考虑所有情况,如果mid是left + (right - left)/2, 那mid会偏左,所以right是可以写成。right = mid,而不用加1的,也不回导致死循环。

    • @chaofengchen5862
      @chaofengchen5862 10 месяцев назад +1

      你这个方法的最大问题是,返回值不清晰。

    • @chaofengchen5862
      @chaofengchen5862 10 месяцев назад

      你这个方法的最大问题是,返回值不清晰。

    • @DED_Search
      @DED_Search 6 месяцев назад

      其实是向下取整的时候 left 必须= mid - 1 才不会导致死循环

  • @TheRita0927
    @TheRita0927 2 года назад

    讲的太好了!困扰了很久的二分查找终于解决了。

  • @hujingtao1
    @hujingtao1 3 года назад +4

    讲的也太好了吧!!!!,建议翻译成英文版本供全球程序员学习

  • @timjin9156
    @timjin9156 2 года назад

    这个讲的是真好!以前根本不在意l r 的意义 只为了找到值 所以最后会不知道蓝和红的边界

  • @shawnz9833
    @shawnz9833 3 года назад

    最好的binary search讲解之一 感谢

  • @qingli1799
    @qingli1799 2 года назад +1

    Super super! I finally can write binary search correctly! Millions of thanks! Can you share more videos about algorithms?

  • @李宁南
    @李宁南 3 года назад +6

    视频好棒,感谢!一个小小建议:感觉背景音乐有一点吵。这么优质的视频其实没必要加背景音乐的哈哈,只有人声讲解就已经很棒了

  • @yizhang395
    @yizhang395 3 года назад +2

    兄弟可以多出一点可视化视频,赞

  • @wenyicui8239
    @wenyicui8239 3 года назад

    讲得好好!!btw我感觉我在听男生版眉姐姐讲二分查找,体验满分!!

  • @jameszhang2284
    @jameszhang2284 3 года назад +6

    这个模版对isBlue()函数中如果存在需要依赖l, r 的值做判断的话是不是会非常麻烦,因为l, r的index有可能不在[0, n) 比如leetcode 33题

    • @shawnz9833
      @shawnz9833 3 года назад

      or 540. Single Element in a Sorted Array ?? K 的index 是在[1, n - 1) 之间,但是 l 和 r 的取值还是 -1 and n

    • @yaguangliu864
      @yaguangliu864 2 года назад

      完全可以啊~ 可以仔细想想

    • @xiaoxiyu8752
      @xiaoxiyu8752 2 года назад

      两次bs,第一找蓝色sorted,红色也sorted,第二次就常规搜target。这模版真的好用,感谢up主😘

    • @wwhuiyuan2023
      @wwhuiyuan2023 Год назад

      @@xiaoxiyu8752 woc 我就一直卡在33题不知道怎么用这个方法看了你的回答豁然开朗 感谢!

    • @xiaoxixu7623
      @xiaoxixu7623 Год назад

      可以利用nums[-1](或者nums[0])判断,不需要依赖l, r的值

  • @yel2730
    @yel2730 2 года назад

    可以算出 因为我不会写代码 但是你讲的二分法有一种两边逼近的作用 先从1.0到2.0 找到 比1.4大 比1.5小 然后再从1.40到1.5中找 找打一个数 每次都从比他大的后以为继续下一位的逼近

  • @someoneguo9400
    @someoneguo9400 3 года назад

    深度讲解👍

  • @大盗江南
    @大盗江南 3 года назад +3

    终于明白了😂😂😂谢谢大哥!!就是配音还有音乐 比较干扰,还是麻烦自己说,不要背景音乐

  • @zacharyzhong5019
    @zacharyzhong5019 3 года назад

    大神啊, 希望能多出一些视频解救一下!!! 终于明白了!!!

  • @yunliangli8068
    @yunliangli8068 2 года назад

    厉害,大神

  • @alexli3488
    @alexli3488 2 года назад

    请求更新更多!

  • @chenleo5065
    @chenleo5065 2 года назад

    講得真好

  • @DED_Search
    @DED_Search 6 месяцев назад

    到目前为止 没看过任何一个讲的清楚的二分视频 没有任何人 把初始化left&right, 开闭区间,退出条件(left < right, left + 1 < right, left

  • @cynthiali7151
    @cynthiali7151 5 месяцев назад

    真的强

  • @cmlin4221
    @cmlin4221 3 года назад

    思路不错

  • @cliffcanyon342
    @cliffcanyon342 6 месяцев назад

    這題是不是無法用在33題?感覺比較像通用於普通Binary search

  • @TheRoy714
    @TheRoy714 2 года назад

    講得太好了 刷題快被搞瘋了

  • @riaandherfavs7480
    @riaandherfavs7480 4 месяца назад

    Genius!!!🥳💖

  • @cenchang3765
    @cenchang3765 6 месяцев назад

    请问l+1!=r 为什么不等价于l< r

  • @俞鼎鼎
    @俞鼎鼎 8 месяцев назад

    这个和LC中常用的二分模板还是非常不一样的

  • @asgqwe1829
    @asgqwe1829 4 года назад

    给力!

  • @yyyzzz-k3r
    @yyyzzz-k3r Год назад

    真的牛逼

  • @lijiasun7282
    @lijiasun7282 Год назад

    治好了我多年的心病

  • @progdynamic3114
    @progdynamic3114 2 года назад

    这个模板可以让我的模板精简很多

  • @布雷-z7h
    @布雷-z7h 3 года назад

    厉害

  • @riostark3983
    @riostark3983 Год назад

    仙品,up 早日年入千万

  • @henryzoo5186
    @henryzoo5186 3 года назад

    困扰我多年的问题。。

  • @yyyzzz-k3r
    @yyyzzz-k3r Год назад +1

    我也写了这个模板也可以 (轻微改动):
    class Solution:
    def search(self, nums: List[int], target: int) -> int:
    left = -1
    right = len(nums)
    while left + 1 != right:
    mid = left + (right - left) // 2
    if nums[mid] == target:
    return mid
    if nums[mid] < target:
    left = mid
    else:
    right = mid
    return -1

  • @309289189
    @309289189 2 года назад

    学会了,牛逼啊

  • @justinchen3768
    @justinchen3768 2 года назад

    這也講得太好了吧

  • @fengli8156
    @fengli8156 2 года назад +4

    这个模版在实际题目中几乎没有用处 应用条件很苛刻 target 不存在 empty list 完全处理不了

  • @jinhuizhang702
    @jinhuizhang702 2 года назад

    牛逼

  • @justinz7395
    @justinz7395 3 года назад

    Leetcode 33题用这个就卡住了.. 不太会了. 请教如何能更好的使用这个在33题, 感谢

    • @raferguo2618
      @raferguo2618 3 года назад +1

      我也是这道题模板感觉都不好套上去,一脸懵逼,答案基本都用

    • @yaguangliu864
      @yaguangliu864 2 года назад

      用视频讲解的方法完全可以~ 昨晚亲测

  • @samuelsun7347
    @samuelsun7347 2 года назад

    leetcode 793 , input 1000000000 ?

  • @DED_Search
    @DED_Search 6 месяцев назад

    这讲的跟灵茶山不一样啊 你没灰色区域么? 就一直都是蓝色 和 红色? 没有走完循环 你是不知道left & right 之间的数字跟target什么关系的。你不能用走完的蓝红区域来讲解啊 😂 你之所以可以 left = mid & right = mid 是因为1. 你left right初试的方法导致 是左开右开的区间 2. 你的退出条件是l + 1 < r 不会造成死循环,所以你可以更新到mid 而不需要 mid+1 or mid-1

  • @kopiking352
    @kopiking352 3 года назад

    👍

  • @shawnz9833
    @shawnz9833 3 года назад +1

    540. Single Element in a Sorted Array 我不知道怎么用? 请帮忙

    • @jerrynie6242
      @jerrynie6242 2 года назад

      我也是540看到这个视频的,我个人感觉这个模板不适用于540...

    • @xiaokewang841
      @xiaokewang841 2 года назад +2

      @@jerrynie6242 可以的。我看完了视频以后写的,可以交流一下:
      class Solution {
      public int singleNonDuplicate(int[] nums) {
      int lo = -1, hi = nums.length;
      while(lo + 1 != hi) {
      int mid = lo + (hi - lo)/2;
      int curnum = nums[mid];
      if(mid > 0 && nums[mid - 1] == curnum) {
      mid = mid - 1;
      }
      if(mid == nums.length - 1 || nums[mid + 1] != curnum) return curnum;
      if(mid % 2 == 0) {
      // we always want to move lo pointer to the second number within the pair
      lo = mid + 1;
      } else {
      hi = mid;
      }
      }
      return nums[hi];
      }
      }

    • @oliverli8482
      @oliverli8482 2 года назад

      这个是我写的,感觉还是可以适用
      class Solution {
      public int singleNonDuplicate(int[] nums) {
      int l = -1;
      int r = nums.length;
      int mid = l + (r - l)/2;
      while ( l + 1 < r) {
      mid = l + (r - l)/2;
      if(isValid(nums, mid) ) {
      l = mid;
      } else {
      r = mid;
      }
      }
      return nums[r];
      }
      private boolean isValid(int[] nums, int mid) {
      if ((mid + 1) >= 0 && (mid + 1) < nums.length) {
      // odd
      if ((mid + 1) % 2 == 1) {
      if (nums[mid] == nums[mid+1]) {
      return true;
      } else {
      return false;
      }
      }
      // even
      else {
      if (nums[mid] == nums[mid+1]) {
      return false;
      } else {
      return true;
      }
      }
      }
      return false;

      }
      }

    • @xiaoxiaoxiao2043
      @xiaoxiaoxiao2043 2 года назад

      @@oliverli8482 都是大佬

  • @huitangtt
    @huitangtt 2 года назад +1

    背景音乐太难听了

  • @karywong9898
    @karywong9898 2 года назад +1

    BGM 太吵了

  • @chaofengchen5862
    @chaofengchen5862 2 года назад +1

    感觉帮助不大。动画很精彩呀,加油。

    • @chaofengchen5862
      @chaofengchen5862 Год назад

      时隔9个月又来重温,感觉真的是很厉害的方法,帮助很大。但是上面的解答有个很严重的问题是,如果我要求“数字在升序数组中出现的次数”,也就是例如“123444456789”中4的个数,是需要写两个方法的,一个求升序数组中第一个4所在的下标,另一个求升序数组中最后一个4所在的下标。目前的很多解答都是用一个函数就解决了,但是您的方法却需要写两个函数。

    • @chaofengchen5862
      @chaofengchen5862 Год назад +1

      又看了一天,本质上红蓝的划分是“循环不变量”的图形体现,真的非常精彩。另外“数字在升序数组中出现的次数”确实写两个函数比较直观一些。

    • @chaofengchen5862
      @chaofengchen5862 10 месяцев назад

      一年后我又回来了。可能我确实不太适合学算法。哈哈,遇到二分还是写的很困难。

    • @jeffge8811
      @jeffge8811 8 месяцев назад

      加油呀 别灰心 一定可以的 继续努力坚持 @@chaofengchen5862

    • @tonyz2203
      @tonyz2203 8 месяцев назад

      @@chaofengchen5862 加油 兄弟 !