劍指offer 查詢

2021-08-17 07:53:20 字數 1988 閱讀 3773

查詢包含,順序查詢,二分查詢,雜湊表查詢和二叉排序樹查詢。

一. 二分查詢

題目:旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列為的乙個旋轉,該陣列的最小值為1。

思路

重點說一下二分查詢法。如果是在排序的陣列(或者部分排序的陣列)中查詢乙個數字或者統計某個數字出現的次數,那麼都可以嘗試二分查詢演算法。二分查詢法的精髓就在於,兩個指標,乙個high,乙個low,通過mid來比較,然後將mid賦給high或者low。

**

#include

using

namespace

std;

int findmin(int*array,int length)

}int main()

; cout

}

補充位運算

int main()

if(high>=low&&arr[mid]==num)

temp=mid;

while(temp++<=length-1)

}return count;

}int main()

; int res=findnum(arr,9,5);

cout<高階解法:上面那個解法慢是因為要去確定num第一次和最後一次出現的位置,因此就算使用了二分查詢法還是很慢。但可以用二分查詢法去確定num第一次出現的位置。用二分查詢法找到乙個num之後,看num前面的數是否為num,如果不是,則這個num就是第乙個,否則第乙個num就在前半段,二分了。

#includeusing namespace std;

int findfirstnum(int*arr,int length,int num)

}}int findlastnum(int*arr,int length,int num)

}}int main()

; int first=findfirstnum(arr,9,3);

int last=findlastnum(arr,9,3);

int count=last-first+1;

cout<二.雜湊表查詢

雜湊表最主要的優點是我們利用它能夠在o(1)時間內查詢某一元素,是效率最高的查詢方式;但其缺點是需要額外的空間來實現雜湊表。

題目第乙個只出現一次的字元

在乙個字串(1<=字串長度<=10000,全部由大寫字母組成)中找到第乙個只出現一次的字元。

思路

處理字串中重複或者次數出現等問題,最常用的就是雜湊表,用字串中的字元作為key,字元出現次數作為value,假定只有ascii碼範圍內的字元,則可以開闢乙個256大小的int陣列,將每個字元(key)對映到該陣列的對應位置上,計算每次出現的次數即可,遍歷一次字串,計算每個字元出現的次數,儲存在int陣列的對應位置上,第二次遍歷字串,若第一次出現某個字元對對應到的雜湊表的對應位置處的元素為1,則該字元便是第乙個只出現一次的字元,如果我們是遍歷雜湊表(int陣列),則找到的雜湊表中的第乙個元素為1的位置對應的字元為字串中第乙個最小的只出現一次的字元。時間複雜度為o(n),需要額外的256個int空間來輔助,可以看做空間複雜度為o(1)。

**

#include

using

namespace

std;

char firstnotrepeatingchar(char*str)

}int main()

劍指offer(查詢)

有乙個迴圈有序陣列a,如,不知道其最小值的位置。那麼如何從這樣的陣列中尋找乙個特定的元素呢?我們可以把迴圈陣列分為兩部分,其中必定有一部分是排好序的,比較元素的值,如果在排序陣列中則直接進行二分查詢即可,如果不在排好序的陣列中,則遞迴的呼叫查詢函式。include using namespace s...

劍指offer之查詢

劍指offeroffer中有這樣一道題,把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。初看這道題沒有思路,而且也沒有想...

劍指offer 陣列查詢

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。方法一 暴力查詢 不考慮二維陣列的有序性,兩重迴圈直接遍歷。public class solution ret...