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