演算法 跨越式搜尋之陣列查詢

2021-07-02 02:22:57 字數 1328 閱讀 2834

題目1:給出乙個一維陣列a, 大小為n, 相鄰元素的差的絕對值都為1. 如a = [1, 0, 1, 2, 3, 2, 1, 2, 3],現在給定a和目標查詢數num. 請找到num在陣列中的位置。

題目2:在題目一的前提下,現在要返回num的所有索引位置。

思路:依次遍歷可以實現,但是複雜度o(n).

如果陣列第乙個元素是a[0], 要找的數是num. 設 t = abs(num - a[0]). 由於每個相鄰的數字之差的絕對值為1,所以在第t個位置之前的數字都肯定比num小。因此下次搜尋定位到a[t]。重新計算t, t = abs(num - a[t]),重複上面的步驟。利用了當前位置和查詢數字的差實現了跨越式搜尋。這種搜尋方法比遍歷陣列要高一些。

題目一和題目二其實是乙個題,題目一找到元素後就返回,題目二要直到搜尋到陣列末尾。

ac code:

#include 

#include

#include

#include

using

namespace

std;

int findnuminarray(int arr, int n, int num)

return -1;

}void findallnuminarray(int arr, int n, int num, vector

& ret)

else

}return;

}void main()

; //測試題目一,查詢第乙個匹配的數的索引

printf("查詢%d, \t下標為%d, \t實際下標為0\n",1,findnuminarray(arr, maxlen, 1));

printf("查詢%d, \t下標為%d, \t實際下標為4\n",3,findnuminarray(arr, maxlen, 3));

printf("查詢%d, \t下標為%d, \t實際下標為9\n",4,findnuminarray(arr, maxlen, 4));

printf("查詢%d, \t下標為%d, \t實際下標為-1\n",-1,findnuminarray(arr, maxlen, -1));

//測試題目二,返回所有的索引

vector

ret;

findallnuminarray(arr, maxlen, 1, ret);

if(!ret.empty())

getchar();

return;

}

二分查詢變形之搜尋旋轉排序陣列

設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例 ...

程式設計演算法之陣列二分查詢法

查詢資料,是每個程式設計師必備的技能,今天介紹一種在陣列中快速查詢的方法 二分查詢法,二分法在前面已經介紹過了,取乙個數字的中間值,如果不對,再取。一直迴圈到最終的結果。此方法比直接在for迴圈裡面迴圈遍歷話費時間要少的多。下面介紹一種常見的二分查詢法。程式設計演算法之陣列二分查詢法.cpp 定義控...

常見演算法之16 二維陣列中查詢元素

題目 已知乙個二維陣列a n n 其中每行的元素按從小到大的順序排好,每列的元素也按從小到大的順序排好,問給定乙個元素v,是否在陣列中存在?方案一 暴力方法。逐個遍歷進行比較。時間複雜度為o n 2 方案二 對上面的方法進行改進,因為每行是有序的,對每行進行二分查詢,共n行。時間複雜度為o nlog...