提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
代码随想录刷题营第一天内容为704. 二分查找 27. 移除元素
提示:以下是本篇文章正文内容,下面案例可供参考
一、二分查找
题目链接:二分查找
注意:数组需要有序且无重复元素
- 解法一:左闭右闭区间
要点:
① 对
② 对target是否在数组中进行预判断
if(target< nums[0] || target > nums [ right])
return -1;
③引入移位符计算中值: 移位符第一个作用就是将数值除以2,第二个作用就是奇数向下取整,且相较于a+b/2形式避免了整数溢出。
mid= left+ ((right-left)>>1);
public int search(int[] nums, int target){
int left=0, right = nums.length-1;
if(target<nums[left] || target> nums[right]){
return -1;
}
while(left<=right){
int mid = left+((right-left)>>1);
if(nums[mid]==target)
return mid;
else if(nums[mid]<target)
left= mid+1;
else if(nums[mid]>target)
right= mid-1;
}
return -1;
}
注意: mid的赋值要放在while循环中
- 左闭右开:
要点:
①不需要对target进行预判断
②右边界更新为mid
public int search(int[] nums, int target){
int left=0, right = nums.length-1;
while(left<right){
int mid = left+((right-left)>>1);
if(nums[mid]==target)
return mid;
else if(nums[mid]<target)
left= mid+1;
else if(nums[mid]>target)
right= mid;
}
return -1;
}
二、移除元素
1. 暴力解法标准解
代码如下(示例):
public int removeElement(int[] nums, int val) {
int M = nums.length ;
for(int n =0; n<M ; n ++ ){
if(nums[n]==val)
{
for(int m = n; m<M-1; m++){
// 右边界M-1是因为m+1取不到M
nums[m]=nums[m+1];
}
n--;
M--;
}
}
return M;
}
随想录解法:
2. 双指针法
代码如下(示例):
public int removeElement(int[] nums, int val) {
int M = nums.length ;
int slow=0;
for(int fast =0; fast<M ; fast ++ ){
if (nums[fast]!= val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
总结
今天是第一天开始刷题 感觉难度还可以