LeetCode: Median of Two Sorted Arrays解题报告

老早进看过这道题了,看见时间复杂度的要求是O(log(m+n))就确定应该和二分查找有关。刚拿到题目的时候,稍微想了想感觉有点麻烦,又有些忌惮“Hard”难度,就放着一直没做。最近在网上搜了搜解题报告,发现沿着http://www.cnblogs.com/TenosDoIt/p/3554479.html的思路做下去,只要把各种情况分析清楚了,其实不是很复杂(我反正是没有一次性全部想清楚,WA了好几次。不过发现不同情况可以互相转换,所以改动不大就过了。。)。以下是做此题的“心路历程”,非典型解题报告:

首先是沿着“删除数”的思路,每次取两个数组内位于[m/2]和[n/2]的数进行比较,删除位于合并后数组两侧相等数量的元素。为了简便操作,我们先假设m<=n(如果不满足,则先交换两个数组),这样每次删除的元素个数则是[m/2]。

按照此流程递归下去,边界条件是什么呢?那就是m==1的时候,你需要考虑nums1剩下的这个数安插进nums2剩下的数里的什么位置,就可以确定中位数怎么计算了。

第一次尝试提交,发现华丽的WA了。仔细一想,发现上面的方法漏掉了一种情况。上面的算只考虑了以下情况:

  1. 中位数只有一个
  2. 中位数是两个数的平均值,且至少有一个数在nums2中

漏掉的一种情况:

  1. 中位数是两个数的平均值,且两个数都在nums1中

这种情况下,当nums1中元素个数为偶数时,如果按照之前的方法,会删掉其中一个本应参与中位数计算的数(nums1为奇数的时候,被删除的数为[m/2],刚好不会删到这个数)。而另一方面,一旦这种情况出现,也就是参与中位数计算的两个数都位于nums1中, 当前nums1的中位数正好就是这两个数,那么这两个数的大小也必然位于nums2目前的中位数之间,那也就不用递归下去了,直接返回结果即可。

修改后又提交了一次,还是WA了,一看数据是[1,4],[2,3]。原来是因为4>3,导致删掉了2和4。而如果是[2,3],[1,4]的顺序的话,则不会有问题。也就是说当m=n的时候,需要保证nums1[m/2]<nums2[n/2]时,才继续递归下去,否则需交换两个数组。 改了这一处之后就AC了。最后附上渣渣代码:

double findMedian(int* a1, int n1, int* a2, int n2) {
    if (n1 &gt; n2) return findMedian(a2, n2, a1, n1);
    int m1 = n1 &gt;&gt; 1, m2 = n2 &gt;&gt; 1;
    if (n1 == n2 &amp;&amp; a1[m1] &gt; a2[m2]) return findMedian(a2, n2, a1, n1);
    if (n1 == 0)
        if (n2 % 2 == 0) return (a2[m2 - 1] + a2[m2]) / 2.0;
        else return (a2[m2]);
    if (n1 == 1)
        if (n2 == 1) return (a1[0] + a2[0]) / 2.0;
        else if (n2 % 2 == 0)
            if (a1[0] &gt;= a2[m2]) return a2[m2];
            else if (a1[0] &gt;= a2[m2 - 1]) return a1[0];
            else return a2[m2 - 1];
        else
            if (a1[0] &gt;= a2[m2 + 1]) return (a2[m2] + a2[m2 + 1]) / 2.0;
            else if (a1[0] &gt;= a2[m2 - 1]) return (a1[0] + a2[m2]) / 2.0;
            else return (a2[m2 - 1] + a2[m2]) / 2.0;
    else
        if (n1 % 2 == 0 &amp;&amp; n2 % 2 == 0 &amp;&amp; a1[m1 - 1] &gt;= a2[m2 - 1] &amp;&amp; a1[m1] &lt;= a2[m2]) return (a1[m1 - 1] + a1[m1]) / 2.0;
        else if (a1[m1] == a2[m2]) return a1[m1];
        else if (a1[m1] &lt; a2[m2]) return findMedian(a1 + m1, n1 - m1, a2, n2 - m1);
        else return findMedian(a1, n1 - m1, a2 + m1, n2 - m1);
}

class Solution {
public:
    double findMedianSortedArrays(vector&lt;int&gt;&amp; nums1, vector&lt;int&gt;&amp; nums2) {
        return findMedian(nums1.data(), nums1.size(), nums2.data(), nums2.size());
    }
};

关于《妄想代理人》

令人不寒而栗的OP,头几集带着强烈的对社会、人性阴暗的绝望,让我不由得对这部片子树立起了敌意。思想不太成熟的人看了,大概很容易剑走偏锋,把这种经过艺术创作夸张化后的绝望代入现实生活而误入歧途吧。故事中的“棒球少年”掌握着每一个受害者的绝望,然而谁会对一个人内心的绝望如此了如指掌?除了最亲密的人,这个人只可能是受害人自己(基于现实的设定),或者超现实的存在(动画里的设定)。而有意思的是,每个被“棒球少年”袭击的受害者在醒来之后似乎真的就拜托了绝望(以至于后来甚至有绝望的人,期盼着棒球少年的到来,给自己一棒,好让自己逃离痛苦?)。然而 警长妻子的出现将整个故事推向了正面:绝望并不是不可战胜的,逃避和厌世永远不是好的归宿,总是自己的错误和失败造成了这一切,也要敢于去面对人生的阴暗面。

然而令人不安的是,故事的结尾,劫后余生的人类依然呈现出焦躁和绝望,一切故事有从头开始,暗示着这个世界似乎走不出绝望,相似的故事将永无止境地重现。这也是我不喜欢这个故事设定的一点:以开头极端的方式将社会的阴暗面解构呈现在你面前,当你看到警长妻子身上的希望是,故事却在最后暗示你,之前的种种依然无济于事(也许今敏不是这个意思,但是很容易被解读成此意,而对观众带来更大的绝望感)。

这种“抛出问题——呈现希望——强制无解”的表达方式很让人无语,心智成熟一点的人可能会理解“即使压力无限重复,也要勇敢面对”,但是心理不够成熟的小孩子会怎么想?会一不小心陷入这种无限的绝望中吧!

你作为一个作者,确实有意无意装了一手好逼,但这么去残害这群潜在的(小学生)受众群体真的好么?

她与她的猫

笑容

今天她同样挺直身躯,打开沉重的铁门,面对门另一边那不完整并且有些残酷的世界。她拼命想要爱上这样的世界,我非常喜欢这样的她。

时间

 

我活在我的时间里,她活在她的时间里所以我们时间互相交错的瞬间,对我而言比任何事物都宝贵。

德国:可再生能源成绩惊人 目标是能源独立 – 新能源百科_互动百科

今天听了个新闻,说德国会在2018年前关闭所有煤矿,2022年前关闭所有核电站。这样措施如果方在中国一样的煤矿消耗大国,是不可想象的。于是我很好奇,德国目前的能源结构是怎么样的,顺手一查,确定让人吃惊:2012年可再生能源竟然占了25%,其中风能占9.2%,然后是生物质能源和太阳能。以上是五年多时间的能源结构改革成果,可见其执行力也是相当强的,难怪他们有底气做这么大改革。

数据来自http://xinnengyuan.h.baike.com/article-500930.html

一点点关于Disparity Map的理解

生物的双目视觉能够提供所看见画面的深度信息,而Disparity Map正是利用了这一特点,根据双摄像头获取的图像之间的差异,来还原图像的深度信息。

原理很简单:距离你越近的物体,双眼视差越大。即当你蒙住一只眼睛看一个“点”,保持姿势看用另一只眼看时,这个“点”会发生跳跃;而这个点距离你越远,跳跃的距离就越小。

Disparity Map即是在获得两幅图上点的对应关系后,以其中一幅图为基准,对每一个像素在另一幅图上求出“跳跃的距离”,所得到的深度信息图(如右下图所示)

Stereopsis and Disparity Map

image from: Color Calibration of Stereo Camera

 

 

《小王子》中关于“权威”的描述

第十个故事里讲了一个独自生活在小行星上的国王的故事。他是一个专制的君主,他告诉小王子,任何事物包括宇宙都不能违背他的命令。于是小王子提出,想立刻看一次日落。国王却表示办不到,他打了个比方:

“要是我命令一个将军像蝴蝶一样从一朵花儿飞到另一朵花儿,或者让他写一部悲剧,或者让他变成一只海鸟,而这个将军拒不执行命令,那是谁,是他还是我的错呢?”

“那是您的错。”小王子肯定地说。

“正是如此。得让每个人去做他能做到的事情。”国王接着说,“权威首先得建立在合理的基础上。如果你命令你的老百姓都去投海,他们就会造反。我之所以有权利让人服从,就是因为我的命令都是合情合理的。”

联想到最近闹得沸沸扬扬的帝吧出征fb事件,湾湾人民老是想拿大陆的“独裁”说事儿,我想说的是,“独裁”和“权威”并不可怕,可怕的是滥用“独裁”和“权威”。我们确实是一党专政,但是党的重要职责之一就是采纳人民的意见,做正确的决策。党性是好的,但问题往往出在一些不公开的执行过程中。而在越来越开放的互联网时代,在决策的制定和执行过程中,暗箱操作的空间正在一点点缩小。

而反观多党制的政府,并不见得就摒除了腐败和为了权力的暗箱争斗。

所以无论一党制还是多党制,只要是执政为民的政府就是好政府吧。