gorm bool 指標 不更新 雙指標型別的例題

2021-10-13 17:26:08 字數 3759 閱讀 5150

題目描述

給定乙個已按照公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 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)。

**如下:

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 個非負整數 a1,a2,...,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

說明:你不能傾斜容器,且 n 的值至少為 2。

圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。

示例:

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

輸出:49

解法(雙指標)

用left和right兩個指標分別指向陣列的開始和結束。接水的體積為:

**如下:

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

3、二維陣列中的查詢題目描述:

在乙個 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...