第一次用简书,注册登录快捷,界面像oneNote。
数组理论基础
第一时间想到的就是连续的一段空间,可以随机访问,添加删除的时间复杂度是o(n),访问,修改时间复杂度o(1) ,看了代码随想录后觉得还能再补充一写理论,知道但是不会立马说出口的。
数组:连续空间上 相同数据类型 的 集合
java中的二维数组不是连续的,类似拉链法的形状
704.二分查找
虽然做过这道题,但是完全不会想到要用二分查找,思维有很大的开阔空间。
需要学习的:二分法的两种写法。[ ],[ )
关于 是否用<= ,<。边界处理。诀窍在于带入数值看是否是合法区间。
1.左闭右闭。
[1,1]是合法区间,所以在while时,left=right是可以取到的,所以可以写成while(left<=right)。
target<middle时,right应该换成middle,但这里需要考虑是middle还是middle-1。显然闭区间middle是可以取到且已知middle>target了,所以新的right不应该包含middle这个值,即right = middle - 1;
target>middle时,left应该换成middle+1。
2.左闭右开
[1,1)不合法,left=right不能取到,while(left<right)
target<middle时,right应该换成middle,但这里需要考虑是middle还是middle-1。显然开区间middle是不可以取到的,所以新的right可以包含middle这个值,即right = middle ;
target>middle时,同理闭区间可以取到,left应该换成middle+1
关于取中间值,自己实现的时候用的是(L+R)/ 2 ,且自己实现的时候不能通过,评论区有人指出这样会造成整型溢出,减法则不会。可以接受的减法是 L+ (R-L)/2.
27.移除元素
只能想到暴力解法。
nums.erase是o(n)的算法。这里双指针也是o(n)
需要学习的:双指针。 数组的元素不能被删除,只能覆盖。因为数组所占的区域已经分给它了,而且是连续的,不能删除单个元素。
快慢指针原地修改值。原理是慢指针记录数组的长度,快指针遍历数组记录需要更新的数值,当数值等于val(需要移除的元素)时,则不往新的数组里加入。