zoukankan      html  css  js  c++  java
  • 编程之美读书笔记——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);

    小结:

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

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

  • 相关阅读:
    [学习笔记]基于值域预处理的快速 GCD
    [学习笔记]整除偏序与zeta变换、Möbius变换、lcm卷积、gcd卷积
    [学习笔记]MinMax容斥
    [学习笔记]Pollard Rho算法
    [学习笔记]Miller Rabin测试
    [学习笔记]万能欧几里得
    用C#写程序安装包 Joe
    linux 命令
    几个有用的php字符串过滤,转换函数
    linux挂载 Windows分区
  • 原文地址:https://www.cnblogs.com/Quains/p/2248951.html
Copyright © 2011-2022 走看看