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

题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。

分析:其实题目意思很简单,如果没有时间复杂度的限制的话,最快的方法莫过于从前往后遍历寻找第一个出现target的元素,若找到最后都没有找到目标元素则输出[-1,-1],然后从后往前寻找第一个出现target的元素,两个元素的下标即为所求结果。
但是题目中要求时间复杂度为logn,那么我们能想到的寻找元素的方法即为二分法,但是此题二分法需要分为两部分考虑,即寻找左边的target以及右边的target。

public int[] searchRange(int[] nums, int target) {
        int leftIdx = findLeftIdx(nums,target);
        int rightIdx = findRightIdx(nums,target);
        int[] result = {-1,-1};
        if (leftIdx == nums.length || nums[leftIdx] != target) {
            return result;
        }
        result[0] = leftIdx;
        result[1] = rightIdx-1;
        return result;
    }
    public int findLeftIdx(int[] nums,int target){
        int low = 0;
        int high = nums.length;
        while (low < high){
            int mid = (low + high)/2;
            if(nums[mid] >= target){
                high = mid;
            }
            else
                low = mid + 1;
        }
        return low;
    }
    public int findRightIdx(int[] nums,int target){
        int low = 0;
        int high = nums.length;
        while (low < high){
            int mid = (low+high)/2;
            if(nums[mid] > target){
                high = mid;

            }
            else
                low = mid + 1;
        }
        return low;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容