- 第一天
- [[704. Binary Search]]
- 个人更倾向于用红蓝法解决此类问题
- 红蓝法其实就是左开右开的特列
- [[35. Search Insert Position]]更适合红蓝法,可以表述为"数组中>= target的第一个数的位置"
-
java //用卡尔视频的方法理解红蓝法 // 左开右开,所以左右都取第一个不能取到的值 // [1,4,5,6,7,8] target= 5 int l = -1; int r = nums.length; // 这里其实就是 while (l < r), 左右不能相等 while( l + 1 != r){ int m = ( l + r) / 2; //这里也一样,因为判断了m不是范围内的值,所以l= m if( nums[m] < target){ l = m; }else{ //这里是tricky的部分,由于红蓝法找的是"红蓝交界的位置",所以需要进行到跳出循环,即使m为所求位置也会进行直到找到“红蓝交接的位置”, 也就是找到例子中l = 1, r = 2 这个位置,然后根据建模,返回r r = m; // else if (nums[m] > target){ //这是正规左开右开写法,找到nums[m] == target 就直接返回m了 // r = m; // }else{ //nums[m] == target; } } return r; //总结:红蓝法循环会一直找到红蓝边界,然后根据建模(红蓝区域)再决定返回l,r,这种比较适合于找》= target 的第一个数,
红蓝法可能出现的问题,找到的index为非法index
-
java //[-1,0,3,5,9,12] target 13 //红蓝法返回的index为6,要加一段代码modify一下 if(r != nums.length){ return nums[r] == target ? r : -1; }else{ return -1; }
[[27. Remove Element]]
挺简单的双指针
- [[704. Binary Search]]
代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。
最新推荐文章于 2024-11-11 00:03:55 发布