二分查找 leetcode704
只能写出暴力破解的方法
思路:
暴力破解:注意循环终止条件 i <= numsSize-1或i < numsSize
看视频学的二分法:
手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找
二分法分为左闭右闭和左闭右开(左开右闭一般不用)两种情况
这两种情况同样也是后面判断left,right,mid的条件
求中间值mid更好的方法:
int middle = left + ((right - left) / 2);
int middle = left + ((right - left) >> 2);
left + (right - left)是防止int类型数据溢出,因为left+right可能是一个比32bit大的数,先求差再加left可以防止溢出;二进制对于正数来说右移x位相当于除以2的x几次方,所以右移一位等于➗2,用位运算的好处是比直接相除的操作快
左闭右闭 | 左闭右开 | |
初始right条件 | right等于数组长度减1 | right直接等于数组长度,因为右边是开区间 |
while循环条件 | left <= right | left < right |
当target > nums[mid] | left = mid + 1 | left = mid + 1 |
当target < nums[mid] | right = mid - 1 | right = mid |
移除元素 leetcode27
同样只能写出暴力破解,两个for循环
思路:
数组元素的移除其实是后一个元素对前一个元素的覆盖,并不是真正内存地址删除。
暴力:先找到要删除元素的下标,再用一个for循环从该下标的后一位开始依次覆盖前一位的值。当移除一个元素后,第一次的for循环的i需要减1,以便下一次循环可以再次检查当前位置。
双指针法:
LeetCode:27. 移除元素
快指针和慢指针同时从数组下标为0的元素开始, 在原数组上进行操作,使其成为一个没有目标元素的新数组。快指针是用来寻找新数组里面所需要的元素,获取到需要元素后需要把该元素赋值给新数组,慢指针就是用来更新数组的。快指针不断后移,当遇到和目标元素不同的元素时,就把该元素赋值给慢指针,更新后慢指针也后移。最后返回慢指针即为新数组长度