704.二分法查找
题目链接:704.二分法查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
基本思路
- 初始化
定义左右指针,分别指向index=0和最后一个。
初始化一个mid指针指向中间位置
- 移动指针
3<9,所以需要移动左指针到mid的下一位,mid指针前面的部分我们就不再比较了.
移动后继续更新mid指针的位置,重复上面的比较
class Solution {
public int search(int[] nums, int target) {
//因为是有序数字,target小于最小值或者大于最大值就可以直接返回了
if(target<nums[0]||target>nums[nums.length-1]){
return -1;
}
//定义两个边界指针
int left=0;
int right=nums.length-1;
while(left<=right){
//定义中点位置
int mid = left + (right - left) / 2;;
if(nums[mid]==target){
return mid;
}
//如果中点数字比target值小
if(nums[mid]<target){
left=mid+1;
}else if(nums[mid]>target){
right=mid-1;
}
}
return -1;
}
}
总结
- 考虑边界情况,区间的开闭。对于极端情况可以在最前面判断。
- 自己在写的时候犯了一个错误mid=right-left/2,导致提交的时候显示超出时间限制。非常理所应当觉得一般就是右边-左边/2,这样相当于只是距离的一半。mid指针要在数组的中间,还需要在加上前面left的偏移量。比如right=5,left=1,right-left=4/2=2,但实际上mid应该指向的位置是下标为3的位置,所以还需要加上left的偏移量。
27.移除元素
题目链接:27.移除元素
思路:双指针
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
class Solution {
public int removeElement(int[] nums, int val) {
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=val){
nums[j]=nums[i];
j++;
}
}
return j;
}
}