代码随想录算法训练营day1| 704.二分查找、27.移除元素
思路
本题为二分查找的经典题目,对于二分查找应该注意的点:
1、要求二分查找的前提是有序的,如果是无序,不适用二分查找,本题为升序数组
2、区间问题,一种是左闭右闭区间[1,3],在这个区间条件下,右边的元素是能获取到的,所以在这种情况下,右边的边界值为:right=nums.length - 1;另一种则是左闭右开区间[1,3),在这种情况下,右边的边界值应该为right = nums.length;
3、对于二分查找中间值mid的计算,mid=(left+right)/2,会涉及到int类型的边界问题,所以应该优化为mid=left+(right-left)/2
Code
解法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 - left) / 2;
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
}
解法2:左闭右开区间
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
while(left < right) {
int mid = left + (right - left) / 2;
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
return -1;
}
}
思路
用两个指针left和right,right遍历数组中的元素,left指向下一个将要赋值的位置。如果右指针指向的元素不等于 val,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;
如果右指针指向的元素等于val,它就是我们需要删除的元素,此时左指针不动,右指针右移一位。
当左右指针遍历完输入数组以后,left 的值就是输出数组的长度。
Code
class Solution {
public int removeElement(int[] nums, int val) {
int left= 0;
for (int right = 0; right< nums.length; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
}