LeetCode算法入门(第三十一天)
数组
119.杨辉三角Ⅱ
class Solution {
public:
vector getRow(int rowIndex) {
vector vec;
vec.push_back(1); //将第一个1压入
for(int i = 1; i <= rowIndex; i++){
vec.push_back(1); //将下一行扩充填入1
for(int j = i - 1; j > 0; j--){ //j从最右边i的前一位开始递减遍历,终止条件是大于左边界0
vec[j] = vec[j] + vec[j-1];
}
}
return vec;
}
};
48.旋转图像
class Solution {
public:
void rotate(vector>& matrix) {
//暴力
int n = matrix.size();
auto newmatrix = matrix;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
// matrix[j][n - i -1] = matrix[i][j]; //直接原矩阵上操作,会导致下一步操作的是已经变换后的矩阵
newmatrix[j][n-i-1] = matrix[i][j];
}
}
matrix = newmatrix;
//不使用另一个矩阵,
int n = matrix.size();
//水平翻转
for(int i = 0; i < n /2; ++i){
for(int j = 0; j < n; ++j){
swap(matrix[i][j], matrix[n-i-1][j]);
}
}
//沿对角线翻转
for(int i = 0; i < n; ++i){
for(int j = 0; j < i; ++j){
swap(matrix[i][j], matrix[j][i]);
}
}
}
};
59.螺旋矩阵Ⅱ
class Solution {
public:
vector> generateMatrix(int n) {
vector> matrix(n ,vector(n));
int count = 1;
int top = 0, left = 0; //外层边界初始值
int right = n - 1, bottom = n-1;
while(left <= right && top <= bottom){
//从左向右填入
for(int i = left; i <= right; i++){
matrix[top][i] = count;
count++;
}
//从上到下
for(int j = top+1; j <= bottom; j++){
matrix[j][right] = count;
count++;
}
if(left < right && top < bottom){
//从右到左
for(int j = right-1; j > left; j--){
matrix[bottom][j] = count;
count++;
}
//从下到上
for(int i = bottom; i > top; i--){
matrix[i][left] = count;
count++;
}
}
left++;
right--;
top++;
bottom--;
}
return matrix;
}
};