LeetCode 34. Find First and Last Position of Element in Sorted Array

题目:

给定一个按升序排序的整数数组,找出给定目标值的起始和结束位置

运行时间复杂度O(log n),如果数组中没有目标,返回[- 1,1]。

Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Input: nums = [5,7,7,8,8,10], target = 8   Output: [3,4]
Input: nums = [5,7,7,8,8,10], target = 6   Output: [-1,-1]

思路:

在排好序的数组中,要找到目标值的起始和结束位置,可先二分找到数,再分别往两边找到数的边界,但是由于时间复杂度需要是logn,因此在寻找边界时,不能使用依次遍历的方式,查找边界也需用二分法

算法分为两个步骤:1)找到数组中的target存在位置;2)找到target的边界

 

代码:

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] re = new int[] {-1,-1};
        int start = 0;
        int end = nums.length-1;
        int loc = -1;

        // 查找出第一个target
        while(start<=end) {
            int mid = (start+end)/2;
            if(nums[mid]==target) {
                loc = mid;
                break;
            }
        	
            if(nums[mid]>target) {
                end = mid - 1;
            }else {
                start = mid + 1;
            }
        }
        
        // 如果没有找到target,直接返回
        if(loc == -1) {
            return re;
        }
                
        // 查找左边界
        if(loc==0) {
            re[0] = loc;
        }else {
            start = 0;
            end = loc-1;
            while(start<=end) {
                int mid = (start+end)/2;
                if(nums[mid]==target) {
                    end = mid-1;
                }else {
                    start = mid + 1;
                }	
            }
			
            if(end<0) {
                re[0] = 0;
            }else {
                re[0] = start;
            }
        }
    
        // 查找右边界
        if(loc==nums.length-1) {
            re[1] = loc;
        }else {
            start = loc + 1;
            end = nums.length-1;
            while(start<=end) {
                int mid = (start + end)/2;
                if(nums[mid]==target) {
                    start = mid + 1;
                }else {
                    end = mid - 1;
                }
            }
			
            if(end>nums.length-1) {
                re[1] = nums.length-1;
            }else {
                re[1] = end;
            }
        }
   
        return re;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值