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)。也可以推导出来。

  • 相关阅读:
    【译文】HTML5 Canvas的点击区域检测以及如何监听Canvas上各种图形的点击事件
    快速排序法精简理解
    数据结构--堆
    数据结构--哈希表
    数据结构--队列
    数据结构--栈
    数据结构--数组
    数据结构--链表
    算法的基本知识
    Arthas
  • 原文地址:https://www.cnblogs.com/lautsie/p/3495734.html
Copyright © 2011-2022 走看看