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

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

作者: zhaojinhui | 来源:发表于2020-07-15 12:23 被阅读0次

题意:给定一个有序数组和一个target数,找出target在数组中的第一个和最后一个位置

思路:

  1. 第一次二分查找,找到比target大的最小数字的位置
  2. 第二次二分查找,找到比target小的最大数字的位置
  3. 以上两次二分查找的两个数字的前一个位置即为所求

思想:二分查找

复杂度:时间O(lgn),空间O(1)

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res = new int[2];
        res[0] = -1;
        res[1] = -1;
        
        int l = 0;
        int len = nums.length;
        int r = len-1;
        
        if(len == 0)
            return res;
        // 二分查找找到数组右边>target的最小的index
        while(l<r) {
            int m = l + (r-l)/2;
            if(nums[m]<=target) {
                l = m+1;
            } else {
                r = m;
            }
        }
        // 如果数组的第一个元素大于target或者比target大的最小index的前一个数字不是target,说明target不在数组中
        if(nums[r] != target && (r == 0 || nums[r-1] < target))
            return res;
        
        // 数组最后一个字符是target
        if(nums[r] == target)
            res[1] = r;
        // 数组最后一个字符不是target
        else 
            res[1] = r-1;
        
        l = 0;
        // 二分查找找到数组左边<target的最小的index
        while(l<r) {
            int m = l + (r-l)/2;
            if(nums[m] < target) {
                l = m + 1;
            } else {
                r = m;
            }
        }
        
        // 第一个数字是target
        if(nums[l] == target)
            res[0] = l;
        // 第一个数字不是target
        else 
            res[0] = l+1;
        
        return res;
    }
}

相关文章

网友评论

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

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