码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-04-21 11:45:15      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:load   第一个   有序数组   描述   个数   get   last   排序数组   有序   

题目描述:
技术图片
解题思路:

仍然是有序数组,考虑使用二分法

  1. 首先用二分法判断第一个target的index值。
    • nums[mid] == target: 和之前不同的是,这个不一定是第一个target,因此要向左继续寻找
    • nums[mid] < target:向右寻找
    • nums[mid] > target:向左寻找
  2. 用二分法判断最后一个target的index值
    • nums[mid] == target: 和之前不同的是,这个不一定是最后一个target,因此要向右继续寻找
    • nums[mid] < target:向右寻找
    • nums[mid] > target:向左寻找

这里要注意的是:返回的left或者right可能会出现越界的情况,要加以判断。

代码:

class Solution {
    public int[] searchRange(int[] nums, int target) {
       if(nums.length == 0){
           return new int[]{-1,-1};
       }
       int first = binarySearchFirst(nums,target);
       if(first > nums.length - 1 || nums[first] != target){
           return new int[]{-1,-1};
       }
       //如果找到了第一个值,那么一定会有最后一个值
       int last = binarySearchLast(nums,target);
       return new int[]{first,last};
    }
    public int binarySearchFirst(int[] nums,int target){
            int left = 0;
            int right = nums.length - 1;
            while(left <= right){
                int mid = (left +right) / 2;
                if(nums[mid] == target){
                    //不一定是第一个target值,继续向左查找
                    right = mid - 1;
                }
                if(nums[mid] < target){
                    //向右寻找
                    left = mid + 1;
                }
                if(nums[mid] > target){
                    //向左寻找
                    right = mid - 1;
                }
            }
            return left;//这里left,如果有目标值target一定是第一个,如果没有target,则返回target右边一个数
        }
        public int binarySearchLast(int[] nums,int target){
            int left = 0;
            int right = nums.length - 1;
            while(left <= right){
                int mid = (left +right) / 2;
                if(nums[mid] == target){
                    //不一定是最后个target值,继续向右查找
                    left = mid + 1;
                }
                if(nums[mid] < target){
                    //向右寻找
                    left = mid + 1;
                }
                if(nums[mid] > target){
                    //向左寻找
                    right = mid - 1;
                }
            }
            return right;//这里right,如果有目标值target一定是最后一个,如果没有target,则返回target左边一个数
        }
}

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

标签:load   第一个   有序数组   描述   个数   get   last   排序数组   有序   

原文地址:https://www.cnblogs.com/forrestyu/p/14675425.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!