59.螺旋矩陣II?
螺旋矩陣沒有什么算法,就是一道單純模擬轉圈的一道題目,因為轉圈的過程需要處理的邊界條件很多,所以有難度
那只能從第二個節點開始處理;從第二個節點開始處理,把最后一個節點也處理了(第二條邊的處理不包含第一個節點)………………如果處理每條邊的時候節點規則都不一樣,要考慮的邊界條件太多,而且極其容易把自己繞進去……
正確思路:
之前在講二分法的時候就講到了循環不變量,那我們在做螺旋矩陣的時候同樣要遵循循環不變量的原則。
循環是一圈一圈的循環,不變量則是我們對每條邊的處理原則,要堅持一個規則來處理每一條邊。
此處按照左閉右開的規則來遍歷這一圈
在處理邊的時候,只處理第一個節點,最后一個節點不處理;遍歷下一條邊時,也只處理一個節點,最后一個節點不處理;最后一個節點要留給下一條邊來處理;下一條邊也是處理第一個節點,往后一直遍歷,遍歷到倒數第二個節點,這就是左閉右開。
把最后一個節點留給下一條邊,作為下一條邊的起始位置,大家會發現我轉一圈,其實是堅持一個原則,這都是左閉右開,這樣我四條邊的遍歷規則就統一了,把規則統一之后,代碼就很好寫了。
思路:
#這個循環應該轉幾圈,應該轉n/2這么多圈
#如果n是奇數,例如:3/2=1,也就是轉了一圈,還剩下中間的位置如何處理? 只需要最后判斷一下
#如果這個n是奇數計算(n%2)==1,如果是奇數,我們對所填充的數組進行單獨賦值,將最后一個數字填進去#進入循環后,每一圈的起始位置不可能是一個固定的數,可以定義一個 start x=0,再定義一個start y=0
#這樣我們就定義了一個起起始位置是每一圈都要變的每一圈都要變的,所以我們定義了一個變量,專門來放起始位置。
#起始位置的定義[start x][ start y] =[i][j]offset = 1
count = 1
while(n/2)for (j= starty ;j<n-offset;j++){nums[startx][j] = count++;}#j小于終止位置,終止位置不包含最后一個元素。終止位置也是隨著我們而改變的。所以還需要一個變量來定義它的終止位置。這樣我們就遍歷了第一行。然后對其他元素進行填充。Count是用來計數的,初始值也為一;循環完畢之后j已經等于n減offset。此時j。已經指向第一行的最后一個元素,此時j的值是固定的。到這里第一條橫向邊遍歷完畢,開始遍歷第二條(豎)邊。這豎向條邊的下標為j坐標是(i,j)這么定義的。for (i= startx ;i<n-offset;i++){nums[i][j] = count++;}然后遍歷下方一條橫向邊。我們修改的又是j的值;這里j等于n減offset。此時j這個值不需要初始化,因為我們所遍歷的這個坐標已經走到這個節點了。i和j都是矩陣中的最大值。此時需要知道j的終點在哪里?J>starty,因為我們不處理他的終點位置,堅持左閉右開的原則。for (;j>starty;j--){nums[i][j] = count++;}最后這條邊遍歷的時候,i已經是最大值。i向上遍歷應該大于Startx;這里的每一條邊所堅持的原則都是只處理第一個節點,不處理最后一個節點。for (;i>starty;i--){nums[i][j] = count++;}那么我們每轉一圈,這個start x和starty,都應該加一;此時結束位置由n-1變為n-2。offset由1變為2。 startx++starty++offset++
if ((n%2)==1){nums[i][j] = count
}
python代碼
代碼隨想錄 (programmercarl.com)
class Solution:def generateMatrix(self, n: int) -> List[List[int]]:startx,starty = 0,0mid = n//2count = 1matrix = [[0]*n for _ in range(n)]for offset in range(1,mid+1) :for j in range(starty,n-offset):matrix[startx][j] = countcount += 1for i in range(startx,n-offset):matrix[i][n-offset] = countcount += 1for j in range(n-offset,starty,-1):matrix[n-offset][j] = countcount += 1for i in range(n-offset,startx,-1):matrix[i][starty] = countcount += 1starty += 1startx += 1if n%2 != 0:matrix[mid][mid] = countreturn matrix
python如何進行模計算?
在Python中,模計算(也稱為取模運算或求余運算)是通過 % 操作符實現的。模計算通常用于求出一個數除以另一個數的余數。這里有一個基本的例子來展示如何在Python中進行模計算:
# 示例:計算10除以3的余數
result = 10 % 3print(result) ?# 輸出: 1
模計算經常用于判斷一個數是否可以被另一個數整除(如果余數為0,則可以整除),以及循環索引的計算(如循環遍歷數組時,將索引保持在數組長度內的操作)。
注意事項
當使用負數進行模計算時,Python的結果可能與其他編程語言不同。在Python中,結果的符號與被除數(左邊的操作數)相同。
# 負數模計算的例子
print(-10 % 3) ?# 輸出: -1,因為余數的符號與被除數相同
print(10 % -3) ?# 輸出: 1,因為余數的符號與被除數相同
當你嘗試用0作為除數進行模計算時,Python會拋出一個ZeroDivisionError。
nums = [[0] * n for _ in range(n)]
Python中的一個列表推導式(list comprehension),用于創建一個二維列表(或稱為矩陣),其大小為n×n,并且初始時所有元素都被初始化為0。這里的n
是一個已經定義好的整數,表示矩陣的行數和列數
for _ in range(n)
: 這是一個循環,循環n次。這里的_
是一個常用的占位符,表示我們不關心循環的當前迭代值(索引)。range(n)
生成一個從0到n-1的序列,但由于我們不需要這個序列的具體值,所以使用_
來忽略它
-
[0] * n
: 這部分創建了一個長度為n的列表,其中包含n個0。這個列表是二維列表中的一行。 -
[[0] * n for _ in range(n)]
: 將上述兩部分結合起來,對于每一次外層循環(循環n次),都創建一個長度為n、所有元素為0的列表。這些列表(即矩陣的行)被收集到一個更大的列表中,形成了n×n的二維列表(矩陣) -
簡單來說,這行代碼就是創建了一個n行n列的二維列表,其中每個元素都被初始化為0。這種結構在編程中非常常見,特別是在需要處理二維空間數據(如圖像、網格等)時。
列表生成式
列表生成式(List Comprehension)是Python中一種簡潔高效創建列表的方式。它允許你通過一個表達式來生成列表,這個表達式可以是任何有效的Python表達式,并且可以包含循環、條件語句等。列表生成式的基本語法如下:
[expression for item in iterable if condition]
expression
:這是一個關于當前元素的表達式,用于生成列表中的新元素。for item in iterable
:這是一個for循環,遍歷可迭代對象(如列表、元組、字符串、集合、字典等)中的每個元素。if condition
(可選):這是一個條件表達式,用于過濾掉那些不滿足條件的元素。只有當條件為真時,當前元素才會被包含在結果列表中。-
squares = [x**2 for x in range(10)] print(squares) # 輸出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]even_squares = [x**2 for x in range(10) if x % 2 == 0] print(even_squares) # 輸出: [0, 4, 16, 36, 64]keys = ['a', 'b', 'c'] values = [1, 2, 3] dict_comprehension = {k: v for k, v in zip(keys, values)} print(dict_comprehension) # 輸出: {'a': 1, 'b': 2, 'c': 3}matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] flattened = [num for row in matrix for num in row] print(flattened) # 輸出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
?//運算符:
在Python中,//
?運算符被稱為整數除法(也稱為地板除)運算符。它執行除法運算,但結果總是向下取整到最接近的整數,即使結果是一個負數。這與傳統的除法(使用?/
?運算符)不同,后者在Python 3中對于整數和浮點數都會返回一個浮點數結果。