#34 Find First and Last Position of Element in Sorted Array

本文介绍了一种算法,用于在已排序的整数数组中查找特定目标值的开始和结束位置,遵循O(logn)的时间复杂度要求。通过示例展示了当目标值存在时如何返回其位置,以及目标值不存在时的处理方式。

Description

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]

Examples

Example 1:

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

Example 2:

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

解题思路

承接 33 题的思路

先按照33题找到任意 target 存在的位置,然后左右找到 start 和 end

class Solution {
    static public int search(int[] nums, int target) {
        int low = 0;
        int high = nums.length - 1;
        while(low <= high){
            int mid = (low + high) / 2;
            int m = nums[mid];
            if(target == m)
                return mid;
            int l = nums[low];
            int h = nums[high];
            if(l <= m){
                if(l <= target && target <= m)
                    high = mid - 1;
                else
                    low = mid + 1;
            }
            else{
                if(m <= target && target <= h)
                    low = mid + 1;
                else
                    high = mid - 1;
            }
            if(low > high)
                return -1;
        }
        return -1;
    }
    public int[] searchRange(int[] nums, int target) {
        int from = search(nums, target);
        int[] answer = {-1, -1};
        int start = from;
        int end = from;
        if(from == -1)
            return answer;
        else{
            while(start > 0 && nums[start] == nums[start - 1])
                start--;
            while(end < nums.length - 1 && nums[end] == nums[end + 1])
                end ++;
        }
        answer[0] = start;
        answer[1] = end;
        return answer;
    }
}

其他

看了solution,觉得和自己的方法大同小异,就没有再写一份啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值