0%

在排序数组中查找数字1


题目:

题解:

1、二分法

  • 解题思路:

    • 使用二分法分别找到 左边界 left和 右边界 right ,易得数字 target 的数量为right−left−1 。
  • 复杂度分析:

    • 时间复杂度 O(log N): 二分法为对数级别复杂度。
    • 空间复杂度 O(1): 几个变量使用常数大小的额外空间。
  • 代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    class Solution {
    public int search(int[] nums, int target) {
    int len = nums.length;
    if (len == 0) {
    return 0;
    }
    int firstPosition = findFirstPosition(nums,target);
    if (firstPosition == -1) {
    return 0;
    }
    int lastPosition = findLastPosition(nums,target);
    return lastPosition - firstPosition + 1;

    }

    // 查找target第一次出现的位置
    private int findFirstPosition(int[] nums,int target) {
    int left = 0;
    int right = nums.length-1;
    while (right > left){
    // 这样写避免left+right在值很大的时候整型溢出
    int mid = left + (right - left) / 2;
    if (nums[mid] < target) {
    // [mid+1 ... right]
    left = mid + 1;
    }else {
    // [left ... mid]
    right = mid;
    }

    }

    if (nums[left] == target) {

    return left;
    }
    return -1;

    }

    // 查找target最后一次出现的位置
    private int findLastPosition(int[] nums, int target) {
    int left = 0;
    int right = nums.length-1;
    while (right > left){
    // 这样写避免left+right在值很大的时候整型溢出
    // 将mid赋值给left的时候要向上取整,不然left可能永远小于right,也就永远跳不出循环
    int mid = left + (right - left + 1) / 2;
    if (nums[mid] <= target) {
    // [mid ... right]
    left = mid;
    }else {
    // [left ... mid-1]
    right = mid - 1;
    }
    }
    // 因为int firstPosition = findFirstPosition(nums,target);已经找到target了,所以必有target,直接返回left即可。
    //if (nums[left] == target) {
    // System.out.println(left);
    // return left;
    //}
    //return -1;
    return left;
    }


    //@Test
    //void test() {
    // int[] nums = {5,7,7,8,8,10};
    // int search = this.search(nums, 8);
    // System.out.println(search);
    //}

    }