704.二分查找
文章讲解:代码随想录
视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
看完随想录之后的想法
两种情况1.左闭右闭 [ ] 2.左闭右开 [ )
当定义时为左闭右闭时,while中if的条件可以把边界排除
if(nums[middle] > target){
right = middle - 1;
}
if(nums[middle] < target){
left = middle + 1;
}
因为middle位置上的元素不可能包含target,下一次循环依然和定义的左闭右闭一样
当定义为左闭右开时,right位置上的元素不可能包含target,所以条件定义为
if(nums[middle] > target){
right = middle ;
}
if(nums[middle] < target){
left = middle + 1;
}
左开右闭好像不行
因为middle总落在靠left的位置(差值为单数)
循环中middle的值
right与left的差值为单数时middle落在中间靠left这边,差值为双数时middle落在正中间
相关的35.34 可以在看完代码之后在纸上演算一遍,帮助理解代码
27.移除元素
题目链接:力扣
文章讲解:代码随想录
视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili
数组可以覆盖,删除不了
看完视频很神奇
双指针 fast指针遍历一遍所有元素,slow指针覆盖之后自加
自己的拓展
数学移位
二进制的左移右移
int middle = left + ((right - left) >> 1);
此处 >> 1 的作用相当于除二
班助的解释
left + (right - left)是防止int类型数据溢出,因为left+right可能是一个比32bit大的数,先求差再加left可以防止溢出;二进制对于正数来说右移x位相当于除以2的x几次方,所以右移一位等于➗2,用位运算的好处是比直接相除的操作快
自己的理解
十进制数字转换为二进制,然后右移一位,之后转换回十进制,相当于除二不加余数
自己的困难
1.代码错误
2.草稿上笔记乱
3.整理思路的时候乱
改进
1.看完题记录自己想法和思路,不急着看解析
2.写博客先输出,先想到啥写啥(尝试)
3.草稿保留好思路和想法