LeetCode4 Median of Two Sorted Arrays
题目:
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)). (Hard)
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 分析:
利用寻找第K个元素的辅助函数。
二分搜索的思想,每次尽量去掉数组中的一部分元素(一半左右);
一次取K个元素出来,nums1中取 K/2个(不够就全都取出), nums2中取 K - K/2(或nums1.size()),
判断取出的两个数组元素中的末位谁大谁小;
如果nums1[p1] < nums2[p2],说明nums1取少了,nums2取多了,第K个元素应该在nums1的后半部分或nums2的前半部分;
如果nums1[p1] > nums2[p2], 说明nums2取少了,nums1取多了,第K个元素应该在nums2的后半部分或nums1的前半部分;
递归求解即可 。边界条件是nums1或nums2为空或K为1; 注:题目思路不是很难想到,但是处理细节有很多容易错的地方。
1.首先应确定Kth是第K个元素,对应下标应该为K-1
2.数组下标,取1/2位置时对应的哪个位置等等要注意,可以采用走样例的方式保证不出错。
3.采用了两种实现方法,一种是拷贝vector,要传参的时候注意左闭右开;
另一种是不拷贝vector,多传两个起始位置start,注意每次取元素操作时不能忘记start
第二个效率稍高,但编码中可能出错的地方也多一点。 代码1:
 class Solution {
 private:
     double findKth(vector<int>& nums1, vector<int>& nums2, int K) { //第K个,对应下标K-1
         if (nums1.size() > nums2.size()) {
             return findKth(nums2,nums1,K);
         }
         if (nums1.size() == ) {
             return nums2[K-];
         }
         if (nums2.size() == ) {
             return nums1[K-];
         }
         if (K == ) {
             return min(nums1[], nums2[]);
         }
         int s = nums1.size();
         int p1 = min( K / , s);
         int p2 = K - p1;
         if (nums1[p1 - ] < nums2[p2 - ]) { //说明nums1取少了,kth在nums1后半段或nums2前半段
             vector<int> n1(nums1.begin() + p1, nums1.end());
             vector<int> n2(nums2.begin(), nums2.begin() + p2);
             return findKth(n1, n2, K - p1);
         }
         else {
             vector<int> n3(nums1.begin(), nums1.begin() + p1);
             vector<int> n4(nums2.begin() + p2, nums2.end());
             return findKth(n3, n4, K - p2);
         }
      }
 public:
     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
         int s1 = nums1.size(), s2 = nums2.size();
         int mid = (s1 + s2) / ;
         if ( (s1 + s2) %  ==  ) {
             return (findKth(nums1, nums2, mid) + findKth(nums1, nums2, mid + )) / 2.0;
         }
         else {
             return findKth(nums1, nums2, mid + );
         }
     }
 };
代码2:
 class Solution {
 private:
     double findKth(vector<int>& nums1, vector<int>& nums2, int K ,int start1, int start2) { //第K个,对应下标K-1
         if (nums1.size() - start1 > nums2.size() - start2) {
             return findKth(nums2,nums1,K,start2,start1);
         }
         if (nums1.size() - start1 == ) {
             return nums2[start2 + K - ];
         }
         if (nums2.size() - start2 == ) {
             return nums1[start1 + K - ];
         }
         if (K == ) {
             return min(nums1[start1], nums2[start2]);
         }
         int s = nums1.size() - start1;
         int p1 =  min( K / , s);
         int p2 =  K - p1;
         if (nums1[start1 + p1 - ] < nums2[start2 + p2 - ]) { //说明nums1取少了,kth在nums1后半段或nums2前半段
             return findKth(nums1, nums2, K - p1, start1 + p1,start2);
         }
         else {
             return findKth(nums1, nums2, K - p2, start1, start2 + p2);
         }
      }
 public:
     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
         int s1 = nums1.size(), s2 = nums2.size();
         int mid = (s1 + s2) / ;
         if ( (s1 + s2) %  ==  ) {
             return (findKth(nums1, nums2, mid,,) + findKth(nums1, nums2, mid + ,,)) / 2.0;
         }
         else {
             return findKth(nums1, nums2, mid + ,,);
         }
     }
 };
其他与二分搜索相关的问题可以参考:
http://www.cnblogs.com/wangxiaobao/p/4915853.html
LeetCode4 Median of Two Sorted Arrays的更多相关文章
- Leetcode4:Median of Two Sorted Arrays@Python
		
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
 - leetcode4 Median of Two Sorted Arrays学习记录
		
学习了扁扁熊的题解:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/4-xun-zhao-liang-ge- ...
 - Leetcode4.Median of Two Sorted Arrays两个排序数组的中位数
		
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ...
 - 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
		
一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...
 - [LintCode] Median of Two Sorted Arrays 两个有序数组的中位数
		
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...
 - 2.Median of Two Sorted Arrays (两个排序数组的中位数)
		
要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ...
 - 【转载】两个排序数组的中位数 / 第K大元素(Median of Two Sorted Arrays)
		
转自 http://blog.csdn.net/zxzxy1988/article/details/8587244 给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素.另外一种更加具 ...
 - LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)
		
题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...
 - No.004 Median of Two Sorted Arrays
		
4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...
 
随机推荐
- 总结调用Flash的几种方法
			
一.Adobe 提供的方法 <object width="200" height="200" classid="clsid:D27CDB6E-A ...
 - 怎么监视跟踪一个进程(Process)中的MS Unit Test DLL的详细性能(performance)【asp.net C#】
			
Sample This tutorial will show how to instrument a unit test DLL for performance profiling. Visual S ...
 - html5基础知识
			
html5+css3 html5定义很多简便东西和宽松语法: 文档头: <!doctype html> 文档编码: <meta cha ...
 - cookie一些简单的操作
			
cookie 保存数据 document.cookie=name+'='+value+';expires='+date; //name=shiyou ;expires=Tue Mar 08 ...
 - 第三百二十三天 how can I 坚持
			
人在最绝望的时候会干啥,<进击的巨人>. 可以绝望,但一定要相信还有希望. 今天去看了<美人鱼>,确实挺好吧. 把愤怒归结于无能,其实是大错特错,愤怒是人的情绪的发泄,是人就有 ...
 - Dagger2 scope
			
1. 一个没有scope的component是不能依赖于另外一个有scope的component 2.@Singleton不是真正意义的单例,比如下面 @Singleton @Component cl ...
 - c#读properties文件
			
@(编程) properties文件 MONGO_URL = mongodb://172.16.20.3/srtc_dc CURRENT_VERSION = 2.0 IS_AUTO_UPDATE = ...
 - hdu 1281 棋盘游戏
			
http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory ...
 - Win7 SP1语言包微软官方下载地址及使用方法 2
			
情形一:如果您的系统版本是企业版.旗舰版,可以在Windows update中检测语言包按照提示下载安装即可.如果觉得Windows update不方便的话,可以在本文第二部分中下载所需的语言包,下载 ...
 - CodeForces 711A Bus to Udayland (水题)
			
题意:给定一个n*4的矩阵,然后O表示空座位,X表示已经有人了,问你是不能找到一对相邻的座位,都是空的,并且前两个是一对,后两个是一对. 析:直接暴力找就行. 代码如下: #pragma commen ...