【LeetCode】螺旋矩阵旋转图像
?🌠 作者:@阿亮joy.
🎆專欄:《阿亮愛刷題》
🎇 座右銘:每個優秀的人都有一段沉默的時光,那段時光是付出了很多努力卻得不到結果的日子,我們把它叫做扎根
目錄
- 👉螺旋矩陣👈
- 👉螺旋矩陣II👈
- 👉旋轉圖像👈
- 👉總結👈
👉螺旋矩陣👈
給你一個 m 行 n 列的矩陣 matrix ,請按照順時針螺旋順序 ,返回矩陣中的所有元素。
示例 1:
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[1,2,3,6,9,8,7,4,5]
示例 2:
輸入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
輸出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
思路:先分別定義上下左右邊界cur、below、left和right,當上邊界大于下邊界或者左邊界大于右邊界時,退出while循環。循環開始,首先,利用for循環向右遍歷矩陣,依次將矩陣的元素加入到返回的數組中。第一個for循環結束,cur++,調整上邊界并判斷是否大于下邊界。如果大于下邊界就退出while循環,否則向下遍歷矩陣。遍歷的方式以及while循環的條件類似,在此就不贅述了。
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {*returnSize = matrixSize * (*matrixColSize);//返回數組元素的個數int* ret = (int*)malloc(sizeof(int)*(*returnSize));int n = 0;//數組下標int cur = 0;//上邊界int below = matrixSize - 1;//下邊界int left = 0;//左邊界int right = *matrixColSize - 1;//右邊界int i = 0;while(1){//向右遍歷一行for(i = left; i <= right; i++){ret[n++] = matrix[cur][i];}//調整上邊界,若上邊界大于下邊界,則遍歷矩陣完成cur++;if(cur > below) break;//向下遍歷一列for(i = cur; i <= below; i++){ret[n++] = matrix[i][right];}//調整右邊界,左邊界大于右邊界,則遍歷矩陣完成right--;if(left > right)break;//向左遍歷一行for(i = right; i >= left; i--){ret[n++] = matrix[below][i];}//調整下邊界,若上邊界大于下邊界,則遍歷矩陣完成below--;if(cur > below)break;//向上遍歷一列for(i = below; i >= cur; i--){ret[n++] = matrix[i][left];}//調整左邊界,左邊界大于右邊界,則遍歷矩陣完成left++;if(left > right)break;}return ret; }👉螺旋矩陣II👈
給你一個正整數 n ,生成一個包含 1 到 n^2 所有元素,且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix 。
示例 1:
輸入:n = 3
輸出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
輸入:n = 1
輸出:[[1]]
提示:
1 <= n <= 20
思路:我們可以借助螺旋矩陣的遍歷的方式,依次給矩陣賦值。
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {*returnSize = n;//函數*returnColumnSizes = (int*)malloc(sizeof(int)*n);//列數組int** ret = (int**)malloc(sizeof(int*)*n);int i = 0;for(i = 0; i < n; i++){ret[i] = (int*)calloc(n, sizeof(int));//將矩陣中的元素初始化為0(*returnColumnSizes)[i] = n;//每一列元素的個數}int cur = 0;//上邊界int left = 0;//左邊界int right = n - 1;//右邊界int below = n - 1;//下邊界int count = 1;//元素while(1){//向右遍歷給矩陣賦值for(i = left; i <= right; i++){ret[cur][i] = count;count++;}//調整上邊界cur++;//判斷上邊界是否大于下邊界,如果大于,賦值完成,退出循環if(cur > below)break;//向下遍歷給矩陣賦值for(i = cur; i <= below; i++){ret[i][right] = count;count++;}//調整右邊界right--;//判斷左邊界是否大于右邊界,如果大于,賦值完成,退出循環if(left > right)break;//向左遍歷給矩陣賦值for(i = right; i >= left; i--){ret[below][i] = count;count++;}//調整下邊界below--;//判斷上邊界是否大于下邊界,如果大于,賦值完成,退出循環if(cur > below)break;//向上遍歷給矩陣賦值for(i = below; i >= cur; i--){ret[i][left] = count;count++;}//調整左邊界left++;//判斷左邊界是否大于右邊界,如果大于,賦值完成,退出循環if(left > right)break;}return ret; }👉旋轉圖像👈
給定一個 n × n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。
你必須在原地旋轉圖像,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉圖像。
示例 1:
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
輸出:[[7,4,1],[8,5,2],[9,6,3]]
示例2:
輸入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
輸出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
提示:
- n == matrix.length == matrix[i].length
- 1 <= n <= 20
- -1000 <= matrix[i][j] <= 1000
思路:先將矩陣中的元素上下對稱交換,然后矩陣中的元素再關于對角線交換,就能達到將圖像順時針旋轉 90 度的效果了。
👉總結👈
本篇文章主要講解了挺經典的矩陣題目,尤其是旋轉矩陣,對循環的把控需要掌握得很到位,才可能解得出來。可能這兩道題目還有更加簡便的解法,現在還未掌握,以后會加以補充。如果大家覺得有收獲的話,可以點個三連支持一下!謝謝大家啦!💖💝??
總結
以上是生活随笔為你收集整理的【LeetCode】螺旋矩阵旋转图像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue3笔记十七(Pinia)
- 下一篇: 游戏开发中,如何将配置表xlsx转lua