演算法之查詢題型總結

2021-09-23 20:29:29 字數 2721 閱讀 2561

1.有序陣列的查詢

二分法:每次迴圈找middle元素與查詢元素比較,確定元素在左半邊還是在右半邊。要注意程式設計的準確性,ringht=n-1,while的判斷條件就為left<=right,而且更新right時right = middle-1,left=middle+1。

2.行列遞增矩陣的查詢

從右上角或者左下角開始查詢,因為這兩個點你給掰直了那就是乙個遞增陣列,所以進行二分查是可行的。

3.出現次數超過一半的數?

解法一:排序法

排序後,可以認為中間的數一定是目標數。

擴充套件:基於partition的方法,每次找到pivote元素,計算他左邊的計數,如果位置小於n/2就重新選取pivote元素,如果大於等於n/2那麼就是目標值。時間可以證明為線性,但是改變了陣列的有序性。(需要額外的判斷這個數的有效性)

解法二:記錄值法

記錄當前值cur,記錄當前值的出現次數time,如果下乙個數與儲存的值不同time--,如果相同就time++,如果儲存的值time為0那麼就更換當前的值即可,最終剩下的就是出現次數超過一半的數。(需要額外的判斷這個數的有效性)

擴充套件:hash表儲存記錄數字出現的次數;

引申擴充套件:

出現的數恰好為一半呢?

原來的程式還能用嗎?如果陣列末尾的值為目標值那麼就不能用了,如果陣列末尾的值不是目標值就可以用。

改進:在原有程式的基礎上要判斷末尾值是否是目標值,最後在判斷輸出即可。

4.字串的查詢

解法一:暴力匹配法

每次模式串p和文字串s不匹配的時候,p會置零,s會回溯回去然後只前進一位。時間o(m*n)

解法二:kmp

計算模式串的最大字首和字尾的長度,每次模式串指標可以跳躍n個單位匹配,文字串指標不會回溯。只需要求出next陣列。

int kmp(string s,string t)

void getnext(int next,string t)

{ int j=0,k=-1;

next[0]=-1;

while(j5.陣列中的最長山脈(longest mountain in array)(同向雙指標)

示例 1:

輸入:[2,1,4,7,3,2,5]

輸出:5

解釋:最長的 「山脈」 是 [1,4,7,3,2],長度為 5。

ps:同向雙指標(滑動視窗),只需遍歷一遍陣列 。

思路:先判斷左山腳,在判斷右山腳。每次更新最大山脈,指標l和r,以及乙個遍歷指標i。

class solution:

def longestmountain(self, a):

""":type a: list[int]

:rtype: int

"""n = len(a)

res = 0

i = 1

while i < n:

l = i - 1 # 左山腳,注意 i 是從 1 開始的

while i < n and a[i] > a[i - 1]:

i += 1

if l == i - 1: # 不是山坡

i += 1

continue

r = i - 1 # 右山腳

while r < n - 1 and a[r] > a[r + 1]:

r += 1

if r == i - 1: # 不是山坡

i += 1

continue

else:

res = max(res, r - l + 1)

i = r + 1 #

6.旋轉陣列元素查詢問題

給乙個旋轉的有序陣列,給乙個目標值找出它的索引;

思路一:先通過一次二分查詢,找到最小元素,在對有序的兩部分進行二分查詢;

思路二:直接通過二分查詢進行,需要判斷左半邊有序還是右半邊有序;

class solution:

def search(self, nums, target):

if nums==:

return -1

n = len(nums)

self.target = target

self.nums = nums

#每次確定有序陣列

l = 0

r = n-1

while l<=r:

mid = (l+r)//2

if nums[mid]==target:

return mid

if nums[mid]>nums[r]:

num1 = self.bin_search(l,mid)

l = mid+1

else:

num1 = self.bin_search(mid,r)

r = mid-1

if num1!=-1:

return num1

return -1

def bin_search(self,start,end):

l = start

r = end

while l<=r:

mid = (l+r)//2

if self.nums[mid]==self.target:

return mid

elif self.nums[mid]>self.target:

r = mid-1

else:

l = mid+1

return -1

演算法之字串題型總結

1.字串的旋轉 給定abcdef,例如把字串的前三個字元移動到後面。形如 defabc!解法一 暴力法 每次所有字串向前移動一位,移動m次即可。但是複雜度為o mn 解法二 三步反轉法 模擬結構的對稱性 通過m把字串分割成兩個字串,然後對這兩個字串分別反轉。最後在對字串整體反轉。abcdef ba ...

Leetcode Greedy 題型總結

我自己對greedy不是很熟悉 覺得greedy題也沒有規律可以遵循,所以比較難 比如134.gas station 如何判斷從 開始開,就是很難,如何判斷在給定的gas和cost的情況下能夠跑完所有的路程。設定乙個total和乙個local,來判斷從 開始第一站。55.jump game 這裡是貪...

常用演算法總結之查詢(一) 簡單查詢

查詢又稱檢索,是指在一批記錄中找出滿足指定條件的某一記錄的過程.在待查詢的資料結構中,每一條記錄一般包含多個資料域,查詢條件一般是給定其中的乙個或幾個域的值.這些域稱作關鍵字.關鍵字有主次之分,主關鍵字可以唯一標識資料結構中的乙個記錄,而次關鍵字則不能唯一區分.簡單查詢對資料的順序沒有要求,但查詢效...