c++ 二維陣列_Numpy陣列切片操作
阿新 • • 發佈:2020-12-13
題目描述:
給定一個正整數 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; } };