zoukankan      html  css  js  c++  java
  • LeetCode——004-Median-of-Two-Sorted-Arrays

    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
    当一看到这道题的算法复杂度的限制为O(log(m+1)),
    就可以排除将两个数组排序后再寻找中位数。
    感觉题目又在提示我们使用二分法,但感觉此处没法使用二分法。

    我的方法就是一边排序一遍判断是否是位,即使用k来对数组A,B进行排序,
    当k==(A+B)/2【数组大小】时,即可直接返回中位数,唯一值得注意的就是数组大小为奇数还是偶数的问题。

    class Solution {
    public:
    	double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    		int m = nums1.size(), n = nums2.size();
    		int i = 0, j = 0, k = 0, mid = (m + n) / 2 + ((m + n) % 2 == 0 ? 0 : 1);
    		double sum = 0.0;
    		while (i < m && j < n)
    		{
    			if (nums1[i] <= nums2[j])sum += nums1[i++];
    			else sum += nums2[j++];
    			++k;
    			if (isReturn(sum, k, mid, m + n))return sum;
    		}
    		while (i < m)
    		{
    			sum += nums1[i++];
    			++k;
    			if (isReturn(sum, k, mid, m + n))return sum;
    		}
    		while (j < n)
    		{
    			sum += nums2[j++];
    			++k;
    			if (isReturn(sum, k, mid, m + n))return sum;
    		}
    		return sum;
    	}
    	bool isReturn(double &sum, int k, int mid, int s)
    	{
    		if (k < mid)
    		{
    			sum = 0.0;
    			return false;
    		}
    		else if (k == mid && s % 2 == 1)
    			return true;
    		else if (k == mid + 1)
    		{
    			sum /= 2.0;
    			return true;
    		}
    		return false;
    	}
    };
    

    借鉴
    借鉴一下大神的思路,
    使用递归求解,但大致思路和我一样。

    class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int m = nums1.size(), n = nums2.size(), left = (m + n + 1) / 2, right = (m + n + 2) / 2;
            return (findKth(nums1, 0, nums2, 0, left) + findKth(nums1, 0, nums2, 0, right)) / 2.0;
        }
        int findKth(vector<int>& nums1, int i, vector<int>& nums2, int j, int k) {
            if (i >= nums1.size()) return nums2[j + k - 1];
            if (j >= nums2.size()) return nums1[i + k - 1];
            if (k == 1) return min(nums1[i], nums2[j]);
            int midVal1 = (i + k / 2 - 1 < nums1.size()) ? nums1[i + k / 2 - 1] : INT_MAX;
            int midVal2 = (j + k / 2 - 1 < nums2.size()) ? nums2[j + k / 2 - 1] : INT_MAX;
            if (midVal1 < midVal2) {
                return findKth(nums1, i + k / 2, nums2, j, k - k / 2);
            } else {
                return findKth(nums1, i, nums2, j + k / 2, k - k / 2);
            }
        }
    };
    
  • 相关阅读:
    ubuntu 下redis的安装简介
    Oracle 的几种循环方式介绍
    NIO 概述 与 通信实例
    io 的一些简单说明及使用
    webSocket的 原理 及 实现
    事务 与事务的 隔离级别 简单说明
    case 函数的简单使用记录下
    java HttpClient 忽略证书的信任的实现 MySSLProtocolSocketFactory
    南京小吃八绝
    JavaScript图表库(百度)
  • 原文地址:https://www.cnblogs.com/zzw1024/p/12122207.html
Copyright © 2011-2022 走看看