当前位置:网站首页>54. Spiral matrix & 59 Spiral matrix II ●●

54. Spiral matrix & 59 Spiral matrix II ●●

2022-07-05 04:50:00 chenyfan_

54. Spiral matrix ●●

To give you one m That's ok n Columns of the matrix matrix , Please follow Clockwise spiral sequence , Returns all elements in the matrix .


 Insert picture description here
Input :matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output :[1,2,3,4,8,12,11,10,9,5,6,7]

  • simulation
    The four edges traverse in order , Move 、 Judgement boundary .
class Solution {
    
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
    
        int m = matrix.size();          // m  That's ok 
        int n = matrix[0].size();       // n  Column 
        int top = 0, right = n-1, left = 0, buttom = m-1; // Boundary index value 
        int numsize = m*n;
        int num = 0;
        vector<int> ans(numsize);
        while(true){
    
            for(int i = left; i <= right; i++){
    
                ans[num++] = matrix[top][i];
            }
            top++;
            if(top>buttom) break;			//  Traverse   Judgement boundary 

            for(int i = top; i <= buttom; i++){
    
                ans[num++] = matrix[i][right];
            }
            right--;
            if(left>right) break;

            for(int i = right; i >= left;  i--){
    
                ans[num++] = matrix[buttom][i];
            }
            buttom--;
            if(top>buttom) break;

            for(int i = buttom; i >= top; i--){
    
                ans[num++] = matrix[i][left];
            }
            left++;
            if(left>right) break;
        }
        return ans;
    }
};

59. Spiral matrix II ●●

Give you a positive integer n , Generate a include 1 To n 2 n^2 n2 All the elements , And the element press Clockwise order Spirally arranged n x n square matrix matrix .


 Insert picture description here
Input :n = 3
Output :[[1,2,3],[8,9,4],[7,6,5]]

  1. Generate a n×n Empty matrix ans, Then simulate the whole inward surrounding filling process :
  2. Define the current left and right upper and lower boundaries l,r,t,b, Initial value num = 1, Iteration termination value numsize = n * n;
  3. When num <= numsize when , Always follow From left to right From top to bottom From right to left From bottom to top Fill in the sequence loop , After each filling :
  4. perform num += 1: Get the next number to fill in ;
  5. Update boundaries : For example, after filling in from left to right , Upper boundary t += 1, Equivalent to the upper boundary shrinking inward 1.
  6. Use num <= numsize instead of l < r || t < b As an iterative condition , In order to Solve when n In an odd number of , The problem that the central number of the matrix cannot be filled in during the iteration .
  7. Eventually return ans that will do .

 Insert picture description here

class Solution {
    
public:
    vector<vector<int>> generateMatrix(int n) {
    
        vector<vector<int>> ans(n, vector<int>(n, 0));
        int up = 0, down = n-1, left = 0, right = n-1;
        int cnt = 1, num = n*n;
        while(cnt <= num){
          //  Iteration conditions , Number of fillings  <=  Lattice number 
            for(int i = left; i <= right; ++i) ans[up][i] = cnt++;  //  Move right  
            ++up;
            for(int i = up; i <= down; ++i) ans[i][right] = cnt++;  //  Move down 
            --right;
            for(int i = right; i >= left; --i) ans[down][i] = cnt++;    //  Move left 
            --down;
            for(int i = down; i >= up; --i) ans[i][left] = cnt++;   //  Move upward 
            ++left;
        }
        return ans;
    }
};
原网站

版权声明
本文为[chenyfan_]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207050446535670.html