zoukankan      html  css  js  c++  java
  • [mock]12月28日

    假设我们有一个全局升序数组,这个数组长度unlimited
    现在我们有一个全局的指针和一个目标target值,target和指针你不可见。但是有以下几个操作
    bool istag();
    void goright();
    void goleft();
    我们保证target一定存在。
    一开始指针指向值为0的位置。
    问题:
    1.你能否找到这个target
    2.请写出你的算法和计算时间复杂度。

    下面是现场写的代码,基本思路是倍增。(如果不是倍增,比如每次回到原点再加一走,是N^2的。) 注意如果为了分析复杂度方便,可以不直接*2折返,可以先回到原点再*2走。

    bool search() {
        int step = 1;
        while (true) {    
            for (int i = 0; i < step; i++) {
                goLeft()
                if (isTarget()) return true;
            }
            step *= 2;
            for (int i = 0; i < step; i++) {
                goRight();
                if (isTarget()) return true;
            }
            step *= 2;
        }
    }
    

    最后分析复杂度的时候,对方给的N是target的值,而我一直用N=2^n的n在算,这是一个不好的。

    最后复杂度是O(N)。可以这么想,最后从原点走到N的位置,最多走N步(因为初始位置0而且数组递增),而由于倍增,那么之前的相对应的步骤加起来也就是N(或者N-1)步。所以最后是O(N)。也可以推导出来。

  • 相关阅读:
    C语言 · 字符串输入输出函数
    C语言 · 判定字符位置
    剑指offer二之替换空格
    剑指offer一之二维数组中的查找
    算法复杂度:时间复杂度与空间复杂度
    二分查找法
    信息熵
    K-means算法的原理、优缺点及改进(转)
    office2013安装与卸载
    Deep Learning (中文版&英文版)
  • 原文地址:https://www.cnblogs.com/lautsie/p/3495734.html
Copyright © 2011-2022 走看看