合并两个排序数组
经典的归并排序有两个指针left right mid 我们在【left,mid】【mid+1,end】两个区间里选谁小就让谁进入temp数组中
- 但这道题的区别在于 不希望有额外空间复杂度 因为已经说明A的后面有大量空间可以用来安放B的元素
- 区别2 由于没有额外空间而对A赋值会造成大量的数组元素移动 浪费时间
应当想到剑指offer中的happy字符串代替 是提前计算好长度 从后边开始添加这样就不会造成移动带来的低效率 7
两个数组的第K大的数
import java.util.*;
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len=nums1.length+nums2.length;
if(len%2==1)
{
return findKthNum(nums1,nums2,0,0,len/2+1);
}
else
{
return (findKthNum(nums1,nums2,0,0,len/2)+ findKthNum(nums1,nums2,0,0,len/2+1))/2.0;
}
}
public double findKthNum(int []A,int []B,int aStart,int bStart,int k)
{
if(aStart>=A.length)
{
return B[bStart+k-1];
}
if(bStart>=B.length)
{
return A[aStart+k-1];
}
if(k==1)
{
return Math.min(A[aStart],B[bStart]);
}
int A_key=aStart+k/2-1<A.length?A[aStart+k/2-1]:Integer.MAX_VALUE;
int B_key=bStart+k/2-1<B.length?B[bStart+k/2-1]:Integer.MAX_VALUE;
if(A_key<B_key)
{
return findKthNum(A,B,aStart+k/2,bStart,k-k/2);
}
else
{
return findKthNum(A,B,aStart,bStart+k/2,k-k/2);
}
}
}
看到log就想到二分法
二分法就是舍掉一半 在数组中舍掉一半就是划范围
在这里找第K大的就先去找第K/2大的 每次删除一半
在数组中第K大 比如第一大 其实应该放在0的位置 所以k-1
- 比较A和B谁的
start+k/2-1
更小 小的话就直接删除这一半 毕竟之后肯定用不到我们要找的是第K大 小于K/2的肯定不符合要求 - 所以每次再从第
K/2+start-1+1
规划数组的范围 接下来我们去找第k-k/2
个数因为前面的k/2个数已经删除了 我们本来要找的是第K个数 现在k/2的数字被删除 就再数组里找k-k/2
- 不断地找不断地删除k/2个 不断地去找下k-k/2个数字 递归的变量已经出现就是两个数组的start在变化 当前的第K个数在变化
- 变量终究会出现第K个数已经是1 不用再分就是当前的范围下数组头谁最小
start不断的后移当已经后移到比length还大 或者一开始的length就很小我们找第K个数 比length都大 那就没法遍历当前这个start冒了的数组 而是要找另一个数组的k-1下标元素
股票的最好买卖时机