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

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

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

你的算法时间复杂度必须是 O(log n) 级别。

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

思路+代码+注释:

class Solution {
    public int[] searchRange(int[] nums, int target) {
        /*
            思路:使用二分查找,查找到值等于target的元素后,如果该元素大于前面的数那么该元素就是起始位置,否则起始位置在该元素左边
            如果该元素小于后面的数那么该元素就是终止位置
             */
            int startIndex=-1;
            int endIndex=-1;
            int low=0;
            int high=nums.length-1;
            while (low<=high)
            {
                int mid=(low+high)/2;
                if (nums[mid]==target)
                {
                    //mid等于0是第一个元素肯定是起始位置
                    if (mid==0 || nums[mid]>nums[mid-1])
                    {
                        //找到起始位置
                        startIndex=mid;
                        break;
                    }else {
                        //mid前还有相等的元素,startIndex应该在左边
                        high=mid-1;
                    }
                }else if (nums[mid]<target)
                {
                    low=mid+1;
                }else {
                    high=mid-1;
                }
            }

        low=0;
        high=nums.length-1;
        while (low<=high)
        {
            int mid=(low+high)/2;
            if (nums[mid]==target)
            {
                //mid是最后一个元素肯定是终止位置
                if (mid==nums.length-1 || nums[mid]<nums[mid+1])
                {
                    //找到终止位置
                    endIndex=mid;
                    break;
                }else {
                    //mid后还有相等的元素,endIndex应该在右边
                    low=mid+1;
                }
            }else if (nums[mid]<target)
            {
                low=mid+1;
            }else {
                high=mid-1;
            }
        }
        return new int[]{startIndex,endIndex};
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36059306/article/details/84848580