自学内容网 自学内容网

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

问题描述

思路解析

  • 遇到这种数组有序查找的情况,第一反应就是二分查找
  • 但是这个数字不是只出现一次的,那么重点就是来了,如何确保找到最开始出现的那个数字呢
  • 只需要我们在找到这个数字的时候,再继续判断。
    • 比如找到最开始出现的数字,那么当我们找到了其中的一个数字的时候,我们不会立即放回,而是让right =mid-1,继续查找
    • 同理,查找最右边的数字,left=mid+1

代码

class Solution {
    public int[] searchRange(int[] nums, int target) {

        int left = 0;
        int right = nums.length - 1;

        int first = -1;
        int last = -1;

        while (left <= right) {
            int mid = (left + right) / 2;

            // 找到第一个等于 target
            if (nums[mid] == target) {
                first = mid;
                right = mid - 1; //没办法确定是不是第一个,所以继续想左找
            }
            if (target < nums[mid]) {
                right = mid - 1;
            }
            if (target > nums[mid]) {
                left = mid + 1;
            }
        }

        // 最后一个
        left = 0;
        right = nums.length - 1;

        while (left <= right) {
            int middle = (left + right) / 2;
            if (nums[middle] == target) {
                last = middle;
                left = middle + 1; // 重点,同理向右找
            } else if (nums[middle] > target) {
                right = middle - 1;
            } else {
                left = middle + 1;
            }
        }
        return new int[]{first,last};
    }
}


原文地址:https://blog.csdn.net/yun_shui_/article/details/144082965

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!