704. 二分查找
思路:emmm,之前做过,这几天还在上课,简单记录一下,思路在代码里
1.左闭右闭区间型
class Solution {
public int search(int[] nums, int target) {
//1.左闭右闭区间型
int right,left,mid;
left = 0;
right = nums.length - 1;
mid = 0;
while(left <= right){
mid = (left + right)/2;
if(nums[mid] > target){//目标值在中值左边,right修改,区间向左缩短
/**
减一是因为这是第一种左闭右闭区间型二分法,nums[right]有效,如果直接等于mid,而不减一,下次二分还会再次搜索从nums[mid]开始,如果目标值存在数组中还好,最终会找到,但如果目标值不在数组中,那么最终将会导致right=left=mid恒成立,那就会导致死循环(因为left<=right恒成立)。还有一种理解方式:因为循环条件是left<=right的,当nums[mid] > target,表示中值一定不是目标值,那么下次就不用再访问中值了,而因为判断条件中,有left == right这个情况,所以为了不造成死循环,不要让已经不可能的情况(即nums[mid]已经不是目标值了)再次被访问,所以修改right = mid - 1
*/
right = mid - 1;
}else if(nums[mid] < target){//目标值在中值右边,left修改,区间向右缩短
left = mid + 1;
}else{//找到目标值,直接返回中值下标
return mid;
}
}
//如果已经退出循环了都没有return,说明肯定是正常跳出循环,说明是没找到了,返回错误信息
return -1;
}
}
2.左闭右开区间型
class Solution {
public int search(int[] nums, int target) {
//2.左闭右开区间型
int right,left,mid;
left = 0;
right = nums.length - 1;
mid = 0;
while(left < right){
mid = (left + right)/2;
if(nums[mid] > target){//目标值在中值左边,right修改,区间向左缩短
/**
直接等于是因为这是第二种左闭右开区间型二分法,nums[right]无效,与方法1思路一样,为了不再次访问nums[mid]这个无效的值,直接令right = mid 即可
*/
right = mid;
}else if(nums[mid] < target){//目标值在中值右边,left修改,区间向右缩短
left = mid + 1;
}else{//找到目标值,直接返回中值下标
return mid;
}
}
//如果已经退出循环了都没有return,说明肯定是正常跳出循环,说明是没找到了,返回错误信息
return -1;
}
}
27. 移除元素
没看题解前,自己随便写了一个两个for循环的,不知道算不算暴力,时间上是超过100%的人,不知道我写的这个复杂度怎么样(*^▽^*)
class Solution {
public int removeElement(int[] nums, int val) {
int temp = 0,i = 0,j = 0;
for(i =0 ; i < nums.length ; i++ ){// 第一层for循环查找哪些等于val
if(nums[i] != val) continue; // 如果不等于那就下一个
for(j = i + 1 ; j < nums.length ; j++){
if(nums[j] != val){
temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
break;
}
}
if(j == nums.length){
break;
}
}
return i;
}
}
时间有点晚了,今天还没写双指针的,先打卡吧,最近是学校考试周,考试结束再好好跟上