只要能保证 一边一定有,或一边一定没有,就可以使用二分法查找,并不要求一定有序。

    时间复杂度 O(log n)

    获取有序列表中 指定元素首次出现的下标

    1. public class Main {
    2. public static void main(String[] args) {
    3. }
    4. private static int getIndex(int[] nums, int target) {
    5. int max = nums.length - 1;
    6. int min = 0;
    7. int mid = 0;
    8. while (max >= min) {
    9. // 正整数 N / 2 等价于 N >> 1
    10. // 等价于 mid = (min + max) / 2;
    11. // 相加运算,容易溢出,右移更安全,更快速
    12. mid = min + (max - min) >> 1;
    13. if (nums[mid] == target) {
    14. while (mid >= 1 && nums[mid] == nums[mid - 1]) {
    15. mid--;
    16. }
    17. return mid;
    18. }
    19. if (nums[mid] > target) {
    20. max = mid - 1;
    21. } else {
    22. min = mid + 1;
    23. }
    24. }
    25. return -1;
    26. }
    27. }