目录
作者简介:
👨🎓一位20级的计科专业的新手,请各位大佬多多指教
🏡个人主页:XiaoChen_Android
📚学习专栏:力扣专栏
🕒发布日期:2022/8/2
『LeetCode|每日一题』排序数组找元素
1.每日一题
2.解题思路
2.1 思路分析
2.2 核心代码
2.3 全部代码
1.每日一题
2.解题思路
2.1 思路分析
S1:首先处理空数组的情况(题目介绍里面有样例),直接返回{-1,-1}(可选择用匿名数组,当然也可以new一个数组);
S2:然后处理没有找到target的情况,也同样据题意返回{-1,-1};
S3:然后是找左右边界,这时我选择了自己画图来让思路更加清晰,例如{1,2,3,8,8,8,8,9}这个数组,target=8;
S4:我们可以先用我们常用的二分查找先找到任何一个target所对应的下标定义为idx;
S5:接下来找左边界,可以定义一个left赋值为刚找到的idx,然后往左寻找(此时要注意不能数组越界--->left - 1 >= 0),并且当左边的数也等于target时就left--,直到找到最左边的那个等于target的数的下标,此时就会等于left;
S6:最后只要找右边界即可,同样的思路,定义一个right也赋值为刚刚找到的idx,然后往右寻找(此时同样要注意不能数组越界--->r + 1 < nums.length),并且右边的数等于target时就right++,直到找到最右边那个等于target的数的下标,此时就等于right;
S7:最后返回new int[] {left,right}。
2.2 核心代码
//二分查找
public int erfen(int[] nums, int target){
int low = 0;
int high = nums.length - 1;
while(low <= high){ //循环条件
int mid = low + (high - low) / 2;
if(nums[mid] == target){ //如果等于即找到了
return mid;
}else if(target < nums[mid]){ //target在mid的左边,所以high = mid - 1
high = mid - 1;
}else low = mid + 1; //target在mid的右边,所以low = mid + 1
}
return -1;//如果nums里没找到则返回-1
}
2.3 全部代码
class Solution {
public int[] searchRange(int[] nums, int target) {
int idx = erfen(nums,target);
if(idx == -1){ //nums不存在target则返回{-1,-1}
return new int[] {-1,-1}; //匿名数组
}
//nums中找到target,则左右滑动指针找区间
int l = idx;
int r = idx;
while(l - 1 >= 0 && nums[l - 1] == nums[idx]){ //防止数组越界
l--;
}
while(r + 1 < nums.length && nums[r + 1] == nums[idx]){ //防止数组越界
r++;
}
return new int[] {l , r};
}
//二分查找
public int erfen(int[] nums, int target){
int low = 0;
int high = nums.length - 1;
while(low <= high){
int mid = low + (high - low) / 2;
if(nums[mid] == target){
return mid;
}else if(target < nums[mid]){
high = mid - 1;
}else low = mid + 1;
}
return -1;//如果nums里没找到则返回-1
}
}
如果文章对你有帮助就支持一下噢,新手尝试,多多指教!