编程之美读书笔记——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);
小结:
与分治、递推、动态规划类似,都是采用一种将一个大问题分解为几个小问题的策略,通常子问题都具有最优子结构的味道。
这是一种通用的解决问题的思路,具体的切入点或许各异,但是根本的理念都是分治策略。