leetcode54. 螺旋矩阵(详解)
生活随笔
收集整理的這篇文章主要介紹了
leetcode54. 螺旋矩阵(详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目
二:上碼
class Solution { public:/**思路:1.1 2 3 45 6 7 89 10 11 1213 14 15 162.我們模擬順時針的順序,那么得分為4步 上面得一行 (1,2,3)左面得一行 (4,8,12)下面得一行 (16,15,14)右面得一行 (13,9,5)可以看到我們在取數字得時候,我們是每次只取出3個,也就是左閉右開那么這只是一圈,我們需要統計出圈數,那么圈數和什么有關呢?圈數 = min(行/2,列/2);3.模擬完圈數我們還應該考慮一個問題,那就是我們應該考慮中間的數1>:當行多列少的時候 列不能為偶數 否則就是完整的圈數2>:當列多 行少的時候 行不能為偶數 否則就是完整的圈數3>:當行==列的時候 中間就剩下一個數.*/vector<int> spiralOrder(vector<vector<int>>& matrix) {int n = matrix.size();//行數int m = matrix[0].size();//列數int loop = min(m/2,n/2);//圈數int border = 1;//邊界int startx = 0,starty = 0;int i,j;vector<int> ans;while(loop--) {i = startx;//每圈的起點j = starty;//每圈的起點//最上面的一行 開始為 starty 表示的是我們的行不變 列在變//我們取的是左閉右開 那么我們邊界條件是 m - border(其中border隨著圈數的增加而增加)for ( ; j < m - border; j++) {ans.push_back(matrix[i][j]);}//最右面的一行 列不變 行在變 (這里的列 j 是拿上個for循環的)for ( ; i < n - border; i++) {ans.push_back(matrix[i][j]);}//最下面的一行 行不變列在變(這里的j 是第一個for循環的j i 是第二個for循環中的 i)for ( ; j > starty; j--) {ans.push_back(matrix[i][j]);}//最右面的一行 列不變 行在變 (這里的 i 和 j 都是上面for循環的)for ( ; i > startx; i--) {ans.push_back(matrix[i][j]);}startx++;starty++;border++;//邊界不一樣了 }//處理行數 列數 中存在奇數的情況 就是導致我們的去圈數不完整的情況//當行數比列數要多的時候 列數為奇數的話 那么圈數不完整//當行數比列數要少的時候 行數為奇數的話 那么圈數不完整//當行數 == 列數 且都為奇數的話 那么只處理最中間的數即可//這里我們在處理的時候我們是處理的是 startx 和 starty 因為我們反正我們是 順時針模擬的//我們的startx 和 starty是一直變化的, 我們的邊界的話 是需要左閉右閉的 所以我們 // 減去 border后就又加一了.if (n > m && m % 2 != 0) {//剩下豎著的一列 列不變行在變for ( ; startx < n - border +1; startx++) ans.push_back(matrix[startx][starty]);} else if (n < m && n % 2 != 0) { //剩下橫著的一行 行不變列在變for ( ; starty < m - border+1; starty++) ans.push_back(matrix[startx][starty]);} else if (m == n && m % 2 != 0) {//int mid = m/2;ans.push_back(matrix[mid][mid]);}return ans;} }; 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的leetcode54. 螺旋矩阵(详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3 天仍未修复,《暗黑破坏神 4》游戏玩
- 下一篇: 2023届春招实习拉钩一面凉经