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

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

作者: 衣锦昼行 | 来源:发表于2019-08-07 15:26 被阅读0次

题目:给定一个按照升序排列的整数数组 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;
    }

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/lbnodctx.html