704. 二分查找、35. 搜索插入位置、27.移除元素
前言
近期开始跟着Carl哥的代码随想录刷题,主要目的也是希望自己能够在进行大数据相关方向的求职和实践之余提升自己的代码水平,个人较为熟练的语言是Python,但是这次也想挑战一下自己,检验一下Java的学习成果。今天是理论上的刷题第三天,但是由于前两天过于繁忙,故决定于这个周五将前面落下的一些总结补上。Day1的主要集中点在数组的二分法处理。
704. 二分查找
(题目链接|代码随想录文档讲解)
主要重点是左闭右闭跟左闭右开;我认为要点总结如下:
- 左闭右闭时,while循环写法应该满足
while(l <= r) ; //[l,r] 且l = r 是可以的
- 左闭右闭时,while循环写法应该满足
while(l < r) ; //[l,r] l一定小于r
- 在与target比较的过程中找准nums[mid]元素的定位
//左闭右闭
if(target < nums[mid]){
mid = r - 1; //因为闭区间,所以r必须向左一位
}
if(target > nums[mid]){
mid = l + 1; //l必须向右一位
}
//左闭右开
if(target < nums[mid]){
mid = r; //因为开区间,所以r不被包含
}
if(target > nums[mid]){
mid = l + 1; //左闭,l必须向右一位
}
35. 搜索插入位置
- 要点在于分情况讨论的前提下,是否可以将多种情况纳入为一种,所以实际上只有两种情况:一种是target大于组内所有元素,只能安插在最后方;另一种情况就是插入组内,不论target是否在组内,都会替代那个大于等于它的元素的位置。
r = nums.length - 1;
//这里是一堆代码
return mid; //类似上面二分法,最后返回右边的索引值;
return r+1; //返回安插在数组最后的情况下 元素的索引值
27. 移除元素
- 快慢指针,重点在于快指针用来排除数组内等于target的值,并跳过他们;从而把不等于target的值赋予慢指针指向的数组元素。