Day1|数组理论基础,704.二分查找,27.移除元素

第一次用简书,注册登录快捷,界面像oneNote。

数组理论基础

第一时间想到的就是连续的一段空间,可以随机访问,添加删除的时间复杂度是o(n),访问,修改时间复杂度o(1) ,看了代码随想录后觉得还能再补充一写理论,知道但是不会立马说出口的。

数组:连续空间上 相同数据类型集合

java中的二维数组不是连续的,类似拉链法的形状


704.二分查找

原题: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.移除元素

原题:27.移除元素

只能想到暴力解法。

nums.erase是o(n)的算法。这里双指针也是o(n)

需要学习的:双指针。 数组的元素不能被删除,只能覆盖。因为数组所占的区域已经分给它了,而且是连续的,不能删除单个元素。

快慢指针原地修改值。原理是慢指针记录数组的长度,快指针遍历数组记录需要更新的数值,当数值等于val(需要移除的元素)时,则不往新的数组里加入。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容