代码随想录训练营第一天|二分查找 移除元素

77 阅读2分钟

其实这个博客早就应该写起来啦,但是因为拖延症时间不停地往后拖。 那就决定了从今天开始好好补起来我的算法学习博客。

算法训练营第一天

day1 两道题分别是704 二分查找 27 移除元素以及复习数组理论基础

数组理论基础

数组是最为基础的数据结构,但实际做起来也没有那么简单,所以需要不断地加深理解。
数组是存放在连续内存空间上的相同类型数据的集合。
在删除或者添加数组元素时只能移动和覆盖。

而对于二维数组,它的内存空间还是连续的吗? 在c++中是连续的,在java中由于寻址操作交给JVM去做,所以不是连续的。 java内二维数组存储应如下图。 image.png

704.二分查找

二分查找适用于有序数组且数组内无重复元素。如果数组内有重复数组,那么二分法返回的数组下标可能不唯一。
二分法细节在于讨论二分过程中区间取值开闭的问题。
第一种:左闭右闭
区间左右都闭合,那么while循环里应该写成:left<=right
第二点,if(nums[middle]>right) 并且将right赋值middle-1。
第二种:左闭右开
在这种情况下,右边right的取值是取不到的。所以while时判断条件改为left<right即可。
在if循环中,right取值应该改为middle 因为本身这个值也是取不到的。
代码过程:

image.png 学到了>>n运算符 相当于num/2^n 二分法可以写成left+(left-right)/2防止溢出。

27.移除元素

给定一个数组,要求移除其中指定元素并返回移除后的新长度。
解法1:暴力双层循环 一个for循环遍历检索需要移除的元素。
内层for循环将需要移除的元素前移一位。
解法2:
快慢指针法:快指针遍历数组寻找新数组的元素。慢指针更新新元素的下标,形成新数组。 快慢指针法可以减少一层for循环实现相同的功能。在很多数组和链表钟多有用到。