1. 程式人生 > 其它 >c++ 二維陣列_Numpy陣列切片操作

c++ 二維陣列_Numpy陣列切片操作

題目描述:

給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。

示例:

輸入: 3
輸出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

思路:

模擬順時針畫矩陣的過程:

  • 填充上行從左到右
  • 填充右列從上到下
  • 填充下行從右到左
  • 填充左列從下到上

由外向內一圈一圈這麼畫下去。

不涉及到什麼演算法,就是模擬過程,但卻十分考察對程式碼的掌控能力。

看著不難,上來就開幹;執行的時候各種問題,然後開始各種修修補補。

修修補補版:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> resv(n,vector<int>(n));
        if( n == 0 )
            return resv;

        int len = n*n;
        int i=0, j=0, num = 1;
        int il=1, ir=n-1, jl=0, jr=n-1;
        while( num <= len )
        {
            while( j <= jr )
            {
                resv[i][j++] = num++;
                if( num > len )
                    return resv;
            }
            j=jr--;
            i++;

            while( i <= ir )
            {
                resv[i++][j] = num++;
                if( num > len )
                    return resv;
            }
            i=ir--;
            j--;

            while( j >= jl )
            {
                resv[i][j--] = num++;
                if( num > len )
                    return resv;
            }
            j=jl++;
            i--;

            while( i >= il )
            {
                resv[i--][j] = num++;
                if( num > len )
                    return resv;
            }
            i=il++;
            j++;
        }

        return resv;
    }
};

  

重點思路:

一圈有四條邊,每條邊都保持左閉右開的原則

整理思路版:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> resv(n,vector<int>(n));
        int loop = n/2;
        int mid = n/2;
        int count = 1;
        int starti = 0, startj = 0;
        int i, j, len = n-1;
        while(loop--)
        {
            for( j=startj; j<startj+len; j++ )
                resv[starti][j] = count++;

            for( i=starti; i<starti+len; i++ )
                resv[i][j] = count++;

            for( ; j>startj; j-- )
                resv[i][j] = count++;

            for( ; i>starti; i-- )
                resv[i][j] = count++;

            len -= 2;
            starti++;
            startj++;
        }
        if(n%2)
            resv[mid][mid] = count;
        
	return resv;
    }
};