LeetCode刷题总结(二)4-6

(1)LeetCode4:寻找两个正序数组的中位数

两个有序数组,要求这两个数组合并之后(也是排好序的)的中位数(如果总个数为偶数,则去中间两个数的平均值;为奇数则取中间的数)。
对这个问题的解决,最简单的做法就是把两个数组合并后排序,但这样的时间复杂度较高,所以不采用!
我们可以在不对其进行排序的状态下找到中位数,首先将问题转化为这两个数组合并后从小到大排,求第k个数等于多少? 到时候要求中位数时,只需令 K = (m+n)/2即可,m,n分别为两个数组的元素个数。
○ 求第k个数的基本思路是:
①.首先,我们不合并,分别找到这A,B两个数组中索引值为( k/2)的元素,并记为k1,k2
②.k1和k2的大小比较有三种情况:
1)k1 < k2
2)k1 > k2 ,小的元素所在的数组的前(k/2)的部分一定不会有合并之后的第k个数,它们一定排在第k个数的前面,所以在考虑第k个数的位置时不用再考虑它们了,可以删掉它们
3)k1 = k2 ,两值说明两个(k/2)位置的数都可以作为第k个数,所以这里我们可以随便删掉一边,也就删掉了(k/2)个数
③.综合起来,我们每次都能删掉(k/2)个数,这样在总的数组中原来k的位置就变成了第(k/2)的位置,这样就形成了一个递归,每次我们都能够不断缩小范围,知道原来第k个位置的元素前面的元素全都被“删”完了,最后它 k -> 1时就找到了(即k在删完后变成了数组上的第一个元素),递归结束!
【注】:
1.每次新形成的数组的长度都是大的数据+小的数组减去(k/2)
2.每次砍掉的(k/2)的长度实际上都是在变化的,k = k/2,k在不断地缩小,因为原来的第k个元素在新数组中已经成为了第(k/2)个,所以每次砍掉的距离也都缩小了,在不断地向k所在位置逼近。
○ 由于每次都看去(k/2),所以该算法的时间复杂度就是log(k/2),即为1/2 log(m+n) ====》 log(m+n)

代码展示:

class Solution {
   
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
   
      int tot = nums1.size() + nums2.size(); // 新数组的元素总数
      if(tot % 2 == 0) {
    
      	// 如果总数为偶数的话中位数就是中间两个数的平均数
        int left = find (nums1, 0, nums2, 0, tot / 2); 
        int right = find (nums1, 0, nums2, 0, tot / 2 + 1); // 通过能够根据索引找到任意元素的find函数找到相应位置的值
        return (left + right) / 2.0; // 这里必须除以2.0,否则相除会出现结果截断为0的情况
      } else{
    // 奇数的话就直接返回中间的元素
        return find(nums1, 0, nums2, 0, tot / 2 + 1
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值