題目描述:
給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。
說明:
返回的下標值(index1 和 index2)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。
解法(雙指標):示例:
輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。
利用left,right兩個指標,一開始指向陣列的最左邊和最右邊,若求和小於目標值,則將left右移,若求和大於目標值,則將right左移。該演算法的時間複雜度為o(n),空間複雜度為o(1)。
**如下:
給你 n 個非負整數 a1,a2,...,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。class solution:
def twosum(self, numbers: list[int], target: int) -> list[int]:
left, right = 0, len(numbers) - 1
while left < right:
if numbers[left] + numbers[right] == target:
return [left+1, right+1]
elif numbers[left] + numbers[right] > target:
right -= 1
else:
left += 1
return none
說明:你不能傾斜容器,且 n 的值至少為 2。
圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。
解法(雙指標):示例:
輸入:[1,8,6,2,5,4,8,3,7]
輸出:49
用left和right兩個指標分別指向陣列的開始和結束。接水的體積為:
**如下:
3、二維陣列中的查詢題目描述:class solution:
def maxarea(self, height: list[int]) -> int:
left, right = 0, len(height) - 1
ret = min(height[left], height[right]) * (right - left)
while left < right:
temp = min(height[left], height[right]) * (right - left)
if temp > ret:
ret = temp
if height[left] < height[right]:
left +=1
else:
right-=1
return ret
在乙個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
示例:
方法一(暴力求解):現有矩陣 matrix 如下:
[ [1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]給定 target = 5,返回 true。
給定 target = 20,返回 false。
遍歷整個矩陣進行比較。時間複雜度o(n^2),空間複雜度o(1)。
**如下:
方法二(找規律不斷縮小查詢範圍):class solution:
def findnumberin2darray(self, matrix: list[list[int]], target: int) -> bool:
if len(matrix) == 0: return false
for row in range(len(matrix)):
if target in matrix[row]:
return true
return false
我們可以發現上述規律:首先選取陣列右上角的數字。如果該數字等於要查詢的數字,則查詢過程結束;如果該數字小於要查詢的數字,則該行均小於要查詢的數字,則剔除這個數字所在的行;如果該數字大於要查詢的數字,則剔除這個數字所在的列。那麼每一次都可以在陣列的查詢範圍中剔除一行或者一列,直到返回結果或者查詢範圍超出範圍。這一方法的時間複雜度為o(n),空間複雜度為o(1)。
**如下:
還可以從陣列的左下角進行查詢,**如下:class solution:
def findnumberin2darray(self, matrix: list[list[int]], target: int) -> bool:
if len(matrix) == 0 or len(matrix[0]) == 0: return false
row, column = len(matrix), len(matrix[0])
i, j = 0, column - 1
while i < row and j >= 0:
if matrix[i][j] == target:
return true
elif matrix[i][j] > target:
j -= 1
else:
i += 1
return false
class solution:
def findnumberin2darray(self, matrix: list[list[int]], target: int) -> bool:
if len(matrix) == 0 or len(matrix[0]) == 0: return false
row, column = len(matrix), len(matrix[0])
i, j = row-1, 0
while i >= 0 and j < column:
if matrix[i][j] == target: return true
elif matrix[i][j] > target: i -= 1
else: j += 1
return false
雙指標演算法(持續更新)
演算法思想 利用問題本身與序列的特性 序列遞增性質 使用兩個下標i j對序列進行掃瞄 可以同向掃瞄,也可以反向掃瞄 以較低的複雜度解決問題。tips 要注意雙指標的方向選擇!eg1.給定乙個遞增的正整數序列和乙個正整數m,求序列中不同位置的數a和b,是的它們的和恰好為m,輸出所有滿足條件的方案。兩個...
劍指offer 雙指標
雙指標 21.py 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有奇數字於陣列的前半部分,所有偶數字於陣列的後半部分。class solution def exchange self,nums list int list int j len nums 1 i 0while iif ...
劍指offer 雙指標專題
很經典的雙指標題目 讓指標pt 1 先走k步,pt 2出發。這樣當pt 1達到末尾時,pt 2剛好走到倒數第k個。definition for singly linked list.class listnode def init self,x self.val x self.next none cl...