在排序陣列中查詢元素的第一個和最後一個位置

northli發表於2024-07-22

給你一個按照非遞減順序排列的整數陣列 nums,和一個目標值 target。請你找出給定目標值在陣列中的開始位置和結束位置。

如果陣列中不存在目標值 target,返回 [-1, -1]

你必須設計並實現時間複雜度為 O(log n) 的演算法解決此問題。

 // 兩次二分查詢,分開查詢第一個和最後一個
  // 時間複雜度 O(log n), 空間複雜度 O(1)
  // [1,2,3,3,3,3,4,5,9]
  public int[] searchRange2(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1;
    int first = -1;
    int last = -1;
    // 找第一個等於target的位置
    while (left <= right) {
      int middle = (left + right) / 2;
      if (nums[middle] == target) {
        first = middle;
        right = middle - 1; //重點
      } else if (nums[middle] > target) {
        right = middle - 1;
      } else {
        left = middle + 1;
      }
    }

    // 最後一個等於target的位置
    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;
      }
    }

相關文章