矩阵
矩阵转置
首先明确在c++中可以使用一个n行m列的二维数组或是vector表示矩阵。
A
n
m
=
[
1
0
0
1
0
1
0
1
1
]
A_{nm} = \left [ \begin{array}{c} 1 & 0 & 0 \\ 1 & 0 & 1 \\ 0 & 1 & 1 \\ \end{array} \right]
Anm=
110001011
转置算法
int i, j;
for(i = 0, i < n, ++i)
{
for(j = 0, j < m, ++j)
{
tar[i][j] = 1 - src[i][m-1-j];
}
}
- src表示原矩阵,tar表示转置后的矩阵,先逆序,再取反,即用1去减,即可实现。
tips:
一定要记住vector的定义方式!!!!!!!!!!!!!
组合数
杨辉三角
int** generate(int numRows, int* returnSize, int** returnColumnSizes){
int i, j;
int **ret = (int **)malloc(numRows * sizeof(int *)); // (1)
*returnSize = numRows; // (2)
*returnColumnSizes = (int *)malloc(numRows * sizeof(int)); // (3)
for(i = 0; i < numRows; ++i) {
ret[i] = (int *)malloc( (i+1) * sizeof(int) ); // (4)
(*returnColumnSizes)[i] = i+1; // (5)
for(j = 0; j < i+1; ++j) {
if(j == 0 || j == i) {
ret[i][j] = 1; // (6)
}else {
ret[i][j] = ret[i-1][j] + ret[i-1][j-1]; // (7)
}
}
}
return ret;
}
cpp:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> res;
if (numRows == 1)
{
vector<int> vec = {1};
res.push_back(vec);
return res;
}
if (numRows == 2)
{
vector<int> vec = {1};
res.push_back(vec);
vec.push_back(1);
res.push_back(vec);
return res;
}
vector<int> vec = {1};
vector<int> vec1 = {1,1};
res.push_back(vec);
res.push_back(vec1);
for (int i =2; i<numRows; ++i)
{
vector<int> temp(i+1,0);
temp[0] = 1;
for(int j = 1; j<i; ++j)
{
temp[j] = res[i-1][j-1] + res[i-1][j];
}
temp[i] = 1;
res.push_back(temp);
}
return res;
}
};
杨辉三角单行构造思路:
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> res;
res.push_back(1);
for(int i = 0; i < rowIndex; i++){
res.push_back((long)res[i]*(rowIndex-i)/(i+1));
}
return res;
}
};