05算法學習_59. 螺旋矩陣 II
- 05算法學習_59. 螺旋矩陣 II
- 題目描述:
- 個人代碼:
- 學習思路:
- 第一種寫法:
- 題解關鍵點:
- 個人學習時疑惑點解答:
05算法學習_59. 螺旋矩陣 II
力扣題目鏈接: 59. 螺旋矩陣 II
題目描述:
59. 螺旋矩陣 II
已解答
中等
相關標簽
相關企業
給你一個正整數 n ,生成一個包含 1 到 n2 所有元素
,且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix 。輸入:n = 3
輸出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:輸入:n = 1
輸出:[[1]]
個人代碼:
暴力解法
class Solution {public int[][] generateMatrix(int n) {int startx=0;int starty=0;int[][] nums = new int[n][n];int offet=1;int i ,j;int loop=1;int count =1;while(loop<=n/2){for(j=starty;j<n-offet;j++){nums[startx][j]=count++;}for(i=startx;i<n-offet;i++){nums[i][j]=count++;}for(;j>starty;j--){nums[i][j]=count++;}for(;i>startx;i--){nums[i][j]=count++;}startx++;starty++;offet++;loop++;}if (n % 2 == 1) { // n 為奇數時,單獨處理矩陣中心的值nums[startx][starty] = count;}return nums;}
}
學習思路:
本題并不涉及到什么算法,就是模擬過程,但卻十分考察對代碼的掌控能力。
第一種寫法:
題解關鍵點:
堅持循環不變量原則,左閉右開
代碼參考:
class Solution {public int[][] generateMatrix(int n) {int[][] nums = new int[n][n];int startX = 0, startY = 0; // 每一圈的起始點int offset = 1;int count = 1; // 矩陣中需要填寫的數字int loop = 1; // 記錄當前的圈數int i, j; // j 代表列, i 代表行;while (loop <= n / 2) {// 頂部// 左閉右開,所以判斷循環結束時, j 不能等于 n - offsetfor (j = startY; j < n - offset; j++) {nums[startX][j] = count++;}// 右列// 左閉右開,所以判斷循環結束時, i 不能等于 n - offsetfor (i = startX; i < n - offset; i++) {nums[i][j] = count++;}// 底部// 左閉右開,所以判斷循環結束時, j != startYfor (; j > startY; j--) {nums[i][j] = count++;}// 左列// 左閉右開,所以判斷循環結束時, i != startXfor (; i > startX; i--) {nums[i][j] = count++;}startX++;startY++;offset++;loop++;}if (n % 2 == 1) { // n 為奇數時,單獨處理矩陣中心的值nums[startX][startY] = count;}return nums;}
}
個人學習時疑惑點解答:
注意點:該題變量定義多,要從問題出發理解各個變量的作用,不要死記硬背
模擬過程的時候可以先不考慮為奇數時中間單獨的元素,僅思考完整的n圈
注:該專欄算法參考 : “代碼隨想錄”(程序員卡爾)進行學習。