java数据结构与算法刷题-----LeetCode34. 在排序数组中查找元素的第一个和最后一个位置

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

文章目录

在这里插入图片描述

二分查找

解题思路:时间复杂度O( l o g 2 n log_2n log2n),空间复杂度O( 1 1 1)
  1. 进行两遍二分查找,第一次先找到最左边的target
  2. 第二次找最右边的target
代码

在这里插入图片描述

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int lowerPos = findPos(nums, target, true);//找最左边的target
        if (-1 == lowerPos) return new int[] {-1, -1};//如果没找到,说明数组中没有target
        //如果找到左边的target
        int higherPos = findPos(nums, target, false);//前往找最右边的target
        return new int[] {lowerPos, higherPos};//返回答案
    }
    //findLower参数表示,当前是否找的是最左边的target,true表示找最左边的,false表示找最右边的
    public int findPos(int[] nums, int target, boolean findLower) {
        int left = 0, right = nums.length -1, targetPos = -1;
        while (left <= right) {
            int pos = left + ((right - left) >> 1);//二分查找
            if (nums[pos] > target) right = pos - 1;//如果当前值>target,就去pos左边找
            else if (nums[pos] < target) left = pos + 1;//如果比target小,去右边找
            else {//如果找到了target
                if (findLower) {//判断当前是否要找的是target中最左边的
                    right = pos - 1;//如果是,就去pos左边找最左边的target
                } else left = pos + 1;//如果不是就去右边找最右边的
                targetPos = pos;//保存找到的位置
            }
        }
        return targetPos;//返回找到的target值的位置
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值