算法Day1 (数组)| LeetCode704二分查找、27移除元素
704.二分查找
力扣链接:题目
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路
找好边界条件是while(left <= right) 右闭(mid有效要取)==》 right=middle
还是while(left < right) 右开==》 right=middle-1
代码
class Solution {
public int search(int[] nums, int target) {
int left=0;
int right=nums.length-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]<target){
left=mid+1;
}else if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]==target){
return mid;
}
}
return -1;
}
}
注意的点
计算mid的时候,为了防止溢出,用的是mid=left+(right-left)/2,也等同于(left+right)/2
27.移除元素
力扣链接:题目
思路
快慢指针,快指针一直移动,当遇到与val相同的时候慢指针不动,不同的时候一起动,并将快指针的值赋给慢指针
代码
class Solution {
public int removeElement(int[] nums, int val) {
int fast=0;
int slow=0;
while(fast<nums.length){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
总结
二分查找适用有序、元素不重复的数组(必须满足这两点)
需要对数组原地做改变的可以考虑用双指针