编程之美读书笔记——2.3寻找水王

分析及结果见代码

    /*
[题目:]
寻找"水王".已知一堆无序的ID,其中水王的ID出现的次数超过一半,要求找出水王的ID.
    [思路:]
方法一[用到排序]:先将ID排序,然后取其中i/2+1的数即为水王的ID.
缺点:排序使得时间复杂度增高.

方法二[不用排序]:每次删除两个不同的ID(不管是否是水王的ID),那么
剩下的ID列表中水王的ID出现的次数依然会超过一半,看到这个问题
就可以不断重复这个过程,最后剩下的就是水王的ID.
*/

//无序ID列表
var arr = new Array(9,11,11,13,11,18,19,11,11,20,11); //1,1,1,3,5,1

//candidate记录有可能的ID,same记录两个ID是否相同
var candidate, same=0;

for(var i=0; i<arr.length; i++)
{
//same==0则说明两个ID不同,删了,然后再找一个下一个ID开始比较,重复之前操作
if(same == 0)
{
//存储下一个ID
candidate = arr[i];
same = 1;
}
else
{
//若相同,则same++.
if(candidate == arr[i])
same ++;
else
same --;
}

}
//最后candidate存的值就是水王的ID,
//因为随着问题规模不断缩小后,剩下的只能是相同的ID或只剩一个ID
console.log("水王的ID是:"+candidate);

小结:

  与分治、递推、动态规划类似,都是采用一种将一个大问题分解为几个小问题的策略,通常子问题都具有最优子结构的味道。

  这是一种通用的解决问题的思路,具体的切入点或许各异,但是根本的理念都是分治策略。

posted @ 2011-11-14 21:50  Quains  阅读(421)  评论(0编辑  收藏  举报
无觅相关文章插件,快速提升流量