代码随想录|day1:数组理论基础,704. 二分查找,27. 移除元素
704.二分查找法
第一种写法:左闭右闭[left right]
class Solution {
public int search(int[] nums, int target) {
if(nums.length == 0||nums[0]>target||nums[nums.length-1]<target){
return -1;
}
int left = 0;
int right = nums.length-1;
while(nums[left]<=nums[right]){
int mid = left + ((right-left)>>1);
if(nums[mid] == target){
return mid;
}
if(nums[mid]>target){
right = mid-1;
}
if(nums[mid]<target){
left = mid+1;
}
}
return -1;
}
}
第二种写法 左闭右开 [ left ,right]
class Solution {
public int search(int[] nums, int target) {
if(nums.length == 0||nums[0]>target||nums[nums.length-1]<target){
return -1;
}
int left = 0;
int right = nums.length;
while(nums[left]<nums[right-1]){
int mid = left+((right-left)>>1);
if(nums[mid]==target){
return mid;
}
if(nums[mid]>target){
right = mid;
}
if(nums[mid]<target){
left = mid;
}
}
return -1;
}
}
注意事项:
1.注意初始判断,数组为有界数组,如果最小值大于目标值或最大值小于目标值,就直接返回。
2.求mid时,作除法运算,除以2相当于右移一位。
27. 移除元素
暴力解法:两个for循环,一个用于寻找目标元素,一个每次找到后,依次将后面的元素逐个往前移动。注意为啥要i–(覆盖后的元素很可能还是目标元素,要再次检查);
class Solution {
public int removeElement(int[] nums, int val) {
int size = nums.length;
for(int i = 0; i<size ;i++){
if(nums[i] == val){
for(int j = i+1;j<size;j++){
nums[j-1] = nums[j];
}
i--;
size--;
}
}
return size;
}
}
快慢指针法
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int fast = 0;fast<nums.length; fast++){
if(nums[fast]!=val){
nums[slow] = nums[fast];
slow ++;
}
}
return slow;
}
}