二分
方法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)其中m和n是两个数组的长度空间复杂度:
O(m+n)其中m和n是两个数组的长度
方法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],因为一开始保证了nums1比nums2长度小
复杂度分析
时间复杂度:
O(log(m+n))其中m和n是两个数组的长度空间复杂度:
O(1没有使用到多余的空间
方法3:二分

.
复杂度分析
时间复杂度:
O(log(m+n))其中m和n是两个数组的长度空间复杂度:
O(1没有使用到多余的空间
Follow Up1:给定两个排序数组,找第Kth大的元素
代码可以参考上面方法2
Follow Up2:给定一个无序数组,找第Kth大的元素
方法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