704.二分查找
本题题目要求是有序数组,且没有重复元素,考虑使用二分法。 数组是存放在连续内存空间上的相同类型数据的集合。
区间的定义是不变量,要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界处理都要坚持根据区间的定义来操作,这就是循环不变量规则。
我习惯用左闭右闭的写法。
while(left<=right)要使用<=,因为这里left可以等于right.if(nums[middle]>target)right要赋值middle-1,因为当前nums[middle]不等于target,是大于target,那么接下来要查找的左区间结束下标位置就是middle-1
mid写成
mid=left+((right-left)>>1);
是位运算+防止大数溢出:当给定的数组长度很长,待查找元素的位置靠近数组尾部时,当循环快结束时,left和right可能都会很大,还没等除以2求得平均值,left+right求和的值就已经超过了Int最大范围,导致溢出错误。同符号相加有可能会超出int的最大值溢出,转换成相减除以2就解决了。
27.移除数组元素
本题要求原地移除所有数值等于val的元素,并且返回移除后数组的新长度。不能使用额外的数组空间,必须使用O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。 数组的元素在内存地址中,是开辟一个堆内存,里面的内存地址是连续的,不能单独删除数组中的某个元素,只能覆盖。 使用双指针:
- 快指针:寻找新数组的元素,新数组就是不等于目标元素的数组。
- 慢指针:指向更新后 新数组下标的位置。
今天是组队刷题第一天,白天忙着硕士开题,入党的事情遇到了些问题,好想哭啊。我在学习上是没什么天赋的人,我一直是花很多时间慢慢磨,一点一点去理解。希望所有的事情能顺利一些,希望我接下来两个月可以跟随着进度,做完题目。