LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

进阶:

你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

示例 :

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

有序数组中查找,必然二分法,这个题在于查找到数字后,由于可能有重复,需要把重复数起始位置都找到。

那么当找到数字后,那么用双指针从找到的位置左右扩散寻找相同值即可。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        
        if(nums.length==0){
            return new int[]{-1,-1};
        }

        int right = nums.length-1;
        int left = 0;

        while (left<=right){

            int mid = ((right-left)>>1)+left;

            if(target>nums[mid]){
                left = mid + 1;
            }else if(target<nums[mid]){
                right = mid - 1;
            }else {
                //找到值后,双指针从当前位置,向两边扩散寻找是否还有相同的数
                left = mid;
                right=mid;

                while (left>=0 && target==nums[left]){
                    left--;
                }

                while (right<nums.length && target==nums[right]){
                    right++;
                }
                //由于循环多计算了一次,需要调整一位
                return new int[]{left+1,right-1};
            }

        }

        return new int[]{-1,-1};
    }
}

时间复杂度:O(n),最坏的情况下,数组所有数字都是target,那么需要遍历整个数组。

空间复杂度:O(1)

 

上一篇:34. 在排序数组中查找元素的第一个和最后一个位置


下一篇:【题解】CF1290B Irreducible Anagrams