代码随想录 day1 [704. 二分查找|27. 移除元素]
704. 二分查找
Tips
- 中间值的计算 start + (end - start)/2,为了避免数据长度为int最大值是(start+end)溢出
- 循环条件要注意start=end的情况
思考:
- 中间索引计算:很容易想到
(end+start)/2
,当数组长度为Integer.MAX_VALUE时,会溢出,故使用start + (end - start) / 2
代替 - 两指针相遇时,也需要判断和目标值是否相同,即
start=end
class Solution {
public int search(int[] nums, int target) {
int l = 0 ,r = nums.length -1 ;
while(l <= r){
int m = l +(r-l)/2;
if(nums[m] == target){
return m ;
}else if(nums[m] < target){
l = m + 1;
}else{
r = m -1 ;
}
}
return -1 ;
}
}
27. 移除元素
Tips
- 主要是理解题意,之后就是移动元素到数组末端和交换数组元素
- 返回个数为数据中非目标元素的个数,若便利到非目标元素就要计数+1了
思考:
- 根据题意可知,找到移除目标元素后的元素个数即可,非目标元素后面的元素不用考虑,可以联想到将目标元素统一移动到数据组末端
- len用来记录非目标元素的个数
class Solution {
public int removeElement(int[] nums, int val) {
int l = 0 , r = nums.length -1 ,len = 0 ;
while(l <= r){
if(nums[r] == val){
r-- ;
}else if(nums[l] == val){
//l 和 r交换位置
int tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
l++ ; r-- ; len++ ;
}else{
l++;
//当nums[l]!=目标值时,数组新长度要加1,当前值属于新数组
len++;
}
}
return len ;
}
}