在元素相差1的数组中搜索

时间:2019-03-19 06:33:59

标签: algorithm data-structures

面试问题:给定一个数组,其中任意两个连续元素的值相差1

示例:

vector<int> vec = { 1, 0, -1, -2, -3, -4,-3,-2,-1,0,1, 2, 1, 2, 3 };
            index==>0, 1,  2,  3,  4,  5, 6, 7, 8,9,10,11,12,13,14

目标是在小于O(n)的范围内搜索元素K。

我的尝试: 从索引0开始。我们可以跳过一些索引。由于元素相差1,我们需要搜索k,让昆虫元素出现在可以找到元素的范围内。

index = 0

我可以预测的最大值将为a [idx + k],最小值为a [idx -k],因为每个值相差1 ..但是,这不会导致任何情况

编辑: 代码尝试给出答案中的建议

#include "stdafx.h"
#include "vector"
#include "iostream"
using namespace std;
int closeS(vector<int> & vec, int search , int& hopsTaken)
{
    int idx = 0;
    while (idx < vec.size() && vec[idx] != search)
    {
        idx += abs (search - vec[idx]);

        ++hopsTaken;
    }

    if (idx < vec.size())
    {
        cout << idx <<"\n";
        return idx;
    }

    return -1;
}

int main()
{
    int hopsTaken = 0;
    vector<int> vec = { 1,0,-1,-2,-3,-4,-3,-2,-1,0,1,2,1,2,3 };
    cout << closeS(vec, 3, hopsTaken);  // , 0, vec.size() - 1)];
    cout << "  \n hopsTaken " << hopsTaken <<"  in array size" << vec.size() <<" for k = " << 3 <<"\n";
    int y;
    cin >> y;

    return 0;
}

尝试了很少的项目,并且总是<= O(n / k)

仍在搜索,因为它仍然是O(n)

1 个答案:

答案 0 :(得分:2)

从第一个索引开始,然后按差值跳到搜索到的元素:

例如搜索2:从索引0开始

0, vec[0]=1,  2-1=1  => nextindex 0+1=1
1, vec[1]=0,  2-0=2  => 1+2=3
3, vec[3]=-2, 2--2=4 => 3+4=7
7, vec[7]=-2, 2--2=4 => 7+4=11
11, vec[11]=2

例如搜索3:从索引0开始

0, vec[0]=1,  3-1=2  => 0+2=2
2, vec[2]=-1, 3--1=4 => 2+4=6
6, vec[6]=-3, 3--3=6 => 6+6=12
12, vec[12]=1, 3-1=2  => 12+2=14
14, vec[11]=3