代码随想录刷题训练营Day1

114 阅读2分钟

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就解决了。

bfd35df1e9a3b457250807541293b5b.png

27.移除数组元素

本题要求原地移除所有数值等于val的元素,并且返回移除后数组的新长度。不能使用额外的数组空间,必须使用O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。 数组的元素在内存地址中,是开辟一个堆内存,里面的内存地址是连续的,不能单独删除数组中的某个元素,只能覆盖。 使用双指针:

  • 快指针:寻找新数组的元素,新数组就是不等于目标元素的数组。
  • 慢指针:指向更新后 新数组下标的位置。

今天是组队刷题第一天,白天忙着硕士开题,入党的事情遇到了些问题,好想哭啊。我在学习上是没什么天赋的人,我一直是花很多时间慢慢磨,一点一点去理解。希望所有的事情能顺利一些,希望我接下来两个月可以跟随着进度,做完题目。