LeetCode Algorithm 0004 - Median of Two Sorted Arrays (Hard)

LeetCode Algorithm 0004 - Median of Two Sorted Arrays (Hard)

Problem Link: https://leetcode.com/problems/median-of-two-sorted-arrays/description/


Description

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

You may assume nums1 and nums2 cannot be both empty.

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

Solution C++

#pragma once

#include "pch.h"

// Problem: https://leetcode.com/problems/median-of-two-sorted-arrays/description/

namespace P4MedianOfTwoSortedArrays
{
    class Solution
    {
        public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
        {
#if false // time O( (m+n)/2+1 ), space O( (m+n)/2+1 )
            int lSize = nums1.size();
            int rSize = nums2.size();
            int li = 0, ri = 0;
            int len = (lSize + rSize) / 2 + 1;
            vector<int> n = vector<int>(len);

            for (int i = 0; i < len; i++)
            {
                if (li < lSize && ri < rSize)
                {
                    n[i] = nums1[li] < nums2[ri] ? nums1[li++] : nums2[ri++];
                }
                else if (li >= lSize)
                {
                    n[i] = nums2[ri++];
                }
                else if (ri >= rSize)
                {
                    n[i] = nums1[li++];
                }
            }

            return (lSize + rSize) % 2 == 0 ? (n[len - 1] + n[len - 2]) / 2.0 : n[len - 1];
#endif

#if true // time O( log(min(m,n)) )
            int m = nums1.size();
            int n = nums2.size();
            if (m > n)
            { 
                // to ensure m<=n
                vector<int> temp = nums1; 
                nums1 = nums2; 
                nums2 = temp;
                int tmp = m; 
                m = n; 
                n = tmp;
            }

            int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
            while (iMin <= iMax)
            {
                cout << "iMin=" << iMin << " iMax=" << iMax << endl;
                int i = (iMin + iMax) / 2; // nums1 medium
                int j = halfLen - i; // nums2 medium
                if (i < iMax && nums2[j - 1] > nums1[i])
                {
                    iMin = i + 1;
                }
                else if (i > iMin && nums1[i - 1] > nums2[j])
                {
                    iMax = i - 1;
                }
                else
                { 
                    int maxLeft = 0;
                    if (i == 0)
                    {
                        maxLeft = nums2[j - 1];
                    }
                    else if (j == 0)
                    {
                        maxLeft = nums1[i - 1];
                    }
                    else
                    {
                        maxLeft = nums1[i - 1] > nums2[j - 1] ? nums1[i - 1] : nums2[j - 1];
                    }
                    if ((m + n) % 2 == 1)
                    {
                        return maxLeft;
                    }

                    int minRight = 0;
                    if (i == m)
                    {
                        minRight = nums2[j];
                    }
                    else if (j == n)
                    {
                        minRight = nums1[i];
                    }
                    else
                    {
                        minRight = nums1[i] < nums2[j] ? nums1[i] : nums2[j];
                    }

                    return (maxLeft + minRight) / 2.0;
                }
            }
            return 0.0;
#endif
        }
    };
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值