給你乙個 m 行 n 列的矩陣 matrix ,請按照 順時針螺旋順序 ,返回矩陣中的所有元素。
關於本題給出兩種方法解決:
第一種比較通俗易懂,
第二種則相對麻煩一些,但更具有深度。
首先第一種方法:
這種方法不需要記錄已經走過的路徑,所以執行用時和記憶體消耗都相對較小首先設定上下左右邊界 其次向右移動到最右,此時第一行因為已經使用過了,可以將其從圖中刪去,體現在**中就是重新定義上邊界
判斷若重新定義後,上下邊界交錯,表明螺旋矩陣遍歷結束,跳出迴圈,返回答案
若上下邊界不交錯,則遍歷還未結束,接著向下向左向上移動,操作過程與第一,二步同理 不斷迴圈以上步驟,直到某兩條邊界交錯,跳出迴圈,返回答案
// 第一種方法
class
solutionif(
++up> down)
break
;//重新設定上邊界,若上邊界大於下邊界,則遍歷遍歷完成,下同
for(int i = up; i <= down; i++)if
(--right
break
;for
(int i = right; i >= left; i--)if
(--down
break
;for
(int i = down; i >=up; i--)if
(++left > right)
break;}
return stk;}}
;
第二種方法:
首先定義乙個順時針旋轉方向矩陣,directions[4][2] = , , , },根據上面directions定義,第一列值分別表示行的變化,1代表行往下移加1,-1表示往上移,同樣第二列代表了列的變化,0表示不變,那我們是不是可以理解從(行不變列右移)向(列不變,行下移)的過渡就是代表右轉了呢。
判斷路徑是否進入之前訪問過的位置需要使用乙個與輸入矩陣大小相同的輔助矩陣
stk2[row][column] ,其中的每個元素表示該位置是否被訪問過。當乙個元素被訪問時,將
stk2[row][column] ==true,表示對應位置的元素設為已訪問。
如何判斷路徑是否結束?由於矩陣中的每個元素都被訪問一次,因此路徑的長度即為矩陣中的元素數量,當路徑的長度達到矩陣中的元素數量時即為完整路徑,將該路徑返回。
// 第二種方法
class
solution,,
,};/
vector
result
(vector>
& matrix);}
int dirindex =0;
for(int i =
0; i < rows * columns; i++
) row = row + directions[dirindex][0
];//更新下一次讀取的值
column = column + directions[dirindex][1
];}return stk1;}}
;
//測試用例
int main()
,, };
solution *x = new solution;
solution *y = new solution;
vectorstk1;
vectorstk2;
stk1= x->result(matrix);
stk2 = y->result(matrix);
for (int i = 0; i < stk1.size(); i++) {
cout << stk1[i] 測試結果
C 貪吃蛇二
小菜學習winform 一 貪吃蛇 說到oo可能一說一大堆,這裡面小菜只是簡單的把貪吃蛇抽象出來,先來說蛇,具有的屬性和行為,屬性比如蛇的長度 蛇的寬度 蛇的行動方向等 行為比如是否吃到食物 是否撞牆等,那我們可以抽象乙個蛇的類,這樣實現 1 using system 2using system.c...
leetcode 螺旋矩陣 二維陣列
給定乙個包含 m x n 個元素的矩陣 m 行,n 列 請按照順時針螺旋順序,返回矩陣中的所有元素。示例 1 輸入 1,2,3 4,5,6 7,8,9 輸出 1 2,3 6,9 8,7 4,5 示例 2 輸入 1,2,3,4 5,6,7,8 9,10,11,12 輸出 1 2,3 4,8 12,11...
二維陣列動態分配and螺旋矩陣
前陣子碰到個面試題感覺還挺有意思,讓寫個螺旋矩陣,當時時間緊寫的還挺粗糙的,回家以後又重新完善了下。include using namespace std int main 動態分配二維陣列 int matrix new int n for i 0 i n i int m,k j 0 m n int...