import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param weights int整型一维数组
     * @param target int整型
     * @return int整型一维数组
     */
    public int[] searchRange (int[] weights, int target) {
        int[] ans = new int[2];
        int l = 0, r = weights.length - 1;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (weights[mid] <= target) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        if (weights.length == 0) {
            return new int[] {-1, -1};
        }

        ans[0] = l;

        l = 0;
        r = weights.length - 1;
        while (l < r) {
            int mid = l + (r - l + 1) / 2;
            if (weights[mid] >= target) {
                l = mid;
            } else {
                r = mid - 1;
            }
        }
        ans[1] = l;
        return ans;
    }
}

Java编程语言。

这道题考察的是在一个有序整型数组中寻找目标值的起始和结束位置。给定一个有序整型数组 weights 和一个目标值 target,要求返回目标值在数组中的起始位置和结束位置,如果目标值不存在于数组中,则返回 [-1, -1]。

代码的解释如下:

  1. 初始化存储结果的整型数组 ans,长度为2。
  2. 使用二分查找算法,在有序整型数组中查找目标值的起始位置。定义两个指针 l 和 r,分别指向数组的第一个和最后一个元素。
  3. 在循环中,计算中间位置 mid,然后判断中间位置的元素与目标值的关系:如果中间位置的元素小于等于目标值,将 r 更新为 mid,继续在左半部分查找。如果中间位置的元素大于目标值,将 l 更新为 mid + 1,继续在右半部分查找。
  4. 循环结束后,得到了目标值在数组中的起始位置。将起始位置存储到 ans[0] 中。
  5. 对于结束位置的查找,重置指针 l 和 r,再次使用二分查找算法。如果中间位置的元素大于等于目标值,将 l 更新为 mid,继续在左半部分查找。如果中间位置的元素小于目标值,将 r 更新为 mid - 1,继续在右半部分查找。
  6. 循环结束后,得到了目标值在数组中的结束位置。将结束位置存储到 ans[1] 中。
  7. 如果数组为空,则返回 [-1, -1],表示目标值在数组中不存在。
  8. 返回存储结果的整型数组 ans。