[leetcode]第4题

54 篇文章 0 订阅
4 篇文章 0 订阅
class Solution {
    int myMin(int x, int y) {
        return x < y ? x : y;
    }
    int findNumber(vector<int>& nums1, vector<int>& nums2, int findKth) {
 
        int length_1 = (int) nums1.size();
        int length_2 = (int) nums2.size();
 
        if (length_1 == 0) return nums2[ findKth - 1 ];
        if (length_2 == 0) return nums1[ findKth - 1 ];
 
        int left_1 = 0, left_2 = 0;
        int mid_1 = 0, mid_2 = 0;
        int k;
 
        do {
            if (length_1 - left_1 == 0) return nums2[ findKth - 1 ];
            if (length_2 - left_2 == 0) return nums1[ findKth - 1 ];
            if (findKth == 1) return myMin(nums1[left_1], nums2[left_2]);
            k = findKth / 2;
            if (length_2 - left_2 >= length_1 - left_1) {
                if (length_1 - left_1 < k) k = length_1 - left_1;
                mid_1 = left_1 + (k - 1);
                mid_2 = left_2 + (findKth - k - 1);
            }   else {
                if (length_2 - left_2 < k) k = length_2 - left_2;
                mid_2 = left_2 + (k - 1);
                mid_1 = left_1 + (findKth - k - 1);
            }
            if (nums1[mid_1] < nums2[mid_2]) {
                findKth -= mid_1 - left_1 + 1;
                left_1 = mid_1 + 1;
            }   else {
                findKth -= mid_2 - left_2 + 1;
                left_2 = mid_2 + 1;
            }
        }   while(true);
    }
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int totNumber = (int) nums1.size() + (int) nums2.size();
        int findKth = totNumber / 2;
        if (totNumber % 2 == 1) return findNumber(nums1, nums2, findKth + 1);
        else return (findNumber(nums1, nums2, findKth) + findNumber(nums1, nums2, findKth + 1)) / 2.0;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值