二分

方法1:双指针

  • 双指针merge两个数组,用多余的数组来存储最终的结果

public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int[] arr = mergeArray(nums1, nums2);
    int n = arr.length;
    if (n % 2 == 0) {
        return (arr[(n - 1) / 2] + arr[n / 2]) / 2.0;
    } else {
        return arr[n / 2];
    }
}

private int[] mergeArray(int[] nums1, int[] nums2) {
    int m = nums1.length, n = nums2.length;
    int[] arr = new int[m + n];
    int i = 0, j = 0, k = 0;
    while (i < m && j < n) {
        arr[k++] = nums1[i] < nums2[j] ? nums1[i++] : nums2[j++];
    }
    while (i < m) {
        arr[k++] = nums1[i++];
    }
    while (j < n) {
        arr[k++] = nums2[j++];
    }
    return arr;
}

复杂度分析

  • 时间复杂度:O(m+n)其中mn是两个数组的长度

  • 空间复杂度:O(m+n)其中mn是两个数组的长度

方法2:求Kth

关于 if (len1 == 0) return nums2[start2+k-1];的判断

  • nums1=[1,2]nums2=[3,4]举例,当nums1用完的时候,start1已经跳到len(nums1)的位置,开始发生越界,这时候说明nums1已经用完了,按nums2的数组下标计算目标索引,也就是nums2[start2+k-1],因为一开始保证了nums1nums2长度小

复杂度分析

  • 时间复杂度:O(log(m+n))其中mn是两个数组的长度

  • 空间复杂度:O(1没有使用到多余的空间

方法3:二分

.

复杂度分析

  • 时间复杂度:O(log(m+n))其中mn是两个数组的长度

  • 空间复杂度:O(1没有使用到多余的空间

Follow Up1:给定两个排序数组,找第Kth大的元素

  • 代码可以参考上面方法2

Follow Up2:给定一个无序数组,找第Kth大的元素

215. 数组中的第K个最大元素

方法1:优先队列

方法2:快排

方法3:堆排序

  • 牛顿迭代法

方法1:双指针

方法2:二分

方法1:二分

方法2:双指针

思路参考官解

方法3:TreeMap

方法4:TreeSet

方法1

方法2

方法3

方法1:两层二分

方法2:二分+双指针

方法1:二分

方法1:贪心

方法2:二分

[luogu]P2440 木材加工

[LintCode]437 · 书籍复印

方法1:动态规划

方法2:二分

Reference

Last updated