LeetCode hard 4. Median of Two Sorted Arrays

这道题的难度也是hard,通过率21%,但事实上这道题目并不难,估计也就中等难度吧,然而看到标签的我是崩溃的,标签是二分搜索,分治,数组。然而我就用了一个类似归并的东西,或者说就是暴力解出来的,但是我过了啊,气不气?我们只关心结果,不要在乎过程。

--------------------题目-----------------------

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)).

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
------------------题解-------------------------

题目是不是很熟悉,两个已经排好序的数组,简直就是归并排序一模一样啊,所以我选择归并,不知道分治二分要怎么做,建一个向量,然后每次向向量中添加两个数组最小的一个数,然后把这个数删除,直到找到了中位数即可,是不是很简单,时间复杂度是O(n+m),其实最后提交后我这也不是最慢的,甚至还超过了27%的人。

#include<vector>

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size();
		int m=nums2.size();
		int t=(m+n)/2;//计算中位数的位置
		int k=1;
		int index1=0;//
		int index2=0;//相当于一个指针记录数组的首位
		vector<int> sorted;
		for(k=0;k<=t+1;k++)
		{
			if(index1==n)//给出的数组到了最后,下面一样
				{
					int temp=t+1-k;
					while(temp--)
					{
						sorted.push_back(nums2[index2]);
						index2++;
					}
					break;
				}
			else if(index2==m)
				{
					int temp=t+1-k;
					while(temp--)
					{
						sorted.push_back(nums1[index1]);
						index1++; 
					}
					break;
				}
			else if(nums1[index1]<nums2[index2])//添加一个最小的数到向量中
			{
				sorted.push_back(nums1[index1]);
				index1++; 
			}
			else
			{
				sorted.push_back(nums2[index2]);
				index2++; 
			}
		}
		if((m+n)%2==0)
		return (double)(sorted[t]+sorted[t-1])/2;
		else
		return (double)sorted[t];
    }
};
代码很简单,可能我并没有按照出题人的思路来,走了捷径,但我们老师说过,一切以程序员的效率为主,所以以最快的思路想出来就好啦,规则就是用来打破的嘛,毕竟他时间复杂度没有限制那么死就说明这种方法是可行的。大家可以研究一下出题人的思路,最近准备考试就没时间想那么多了,good luck。顺便分享一句今天看到的一句话吧:有一种人生是可以成功到让金钱跪下来。讲的是中国工程院首批院士刘先林院士为了做好一场报告,七十八岁高龄在高铁二等座上伏案专注画图纸。有图有真相,大家一起共勉吧。

------------------------------手动分割线-----------------------------

see you next illusion


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值