『LeetCode|每日一题』---->在排序数组中查找元素的第一个和最后一个位置

目录

作者简介:

 『LeetCode|每日一题』排序数组找元素

         1.每日一题

         2.解题思路 

               2.1 思路分析

               2.2 核心代码

               2.3 全部代码

1.每日一题

 2.解题思路

作者简介:

👨‍🎓一位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
    }
}


🍁 类似题目推荐:基础算法无论在研究生面试还是求职面试都是十分重要的一环,这里推荐一款算法练习资源:LeetCode;算法题只有多刷勤刷才能保持思路与手感,大家赶紧行动起来吧(温馨提示:常见的面试问答题库也很nice哦)

 如果文章对你有帮助就支持一下噢,新手尝试,多多指教!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值