剑指Offer(leetcode)

方法1.二分

public int minArray(int[] nums) {
    int n = nums.length;
    int l = 0, r = n - 1;
    while (l < r) {
        int mid = l + (r - l) / 2;
        if (nums[mid] < nums[r]) r = mid;
        else if (nums[mid] > nums[r]) l = mid + 1;
        else r--;
    }
    return nums[l];
}

方法1:优先队列

public int[] getLeastNumbers(int[] arr, int k) {
    PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
    for (int x : arr) {
        pq.offer(x);
        if (!pq.isEmpty() && (pq.size() > k)) {
            pq.poll();
        }
    }
    int[] res = new int[k];
    for (int i = 0; i < k; i++) res[i] = pq.poll();
    return res;
}

方法2:排序

剑指 Offer 40. 最小的 k 个数(基于快速排序的数组划分,清晰图解)

扩展

  • 使用链表的方式模拟删除的操作

  • 如果每次旋转的圈数很大,可以mod掉

  • 按递推公式来处理

方法1:回溯

Last updated