目录
一、创建动态二维数组的方法
0x01 C语言法
0x02 C++法
二、 杨辉三角
三、电话号码的数字组合
一、创建动态二维数组的方法
0x01 C语言法
int** p = (int**)malloc(sizeof(int*) * M);//创建M行的数组,每一行都是一个数组
for(size_t i = 0;i < M;i++)
{
p[i] = (int*)malloc(sizeof(int) * N);//每一行有N列
}
0x02 C++法
vector<vector<int>> arr;
//解析:vector相当于一个数组,里面再放个vector<int>,相当于如每一格里面还有一个数组,图可用上图参考
二、 杨辉三角
力扣https://leetcode.cn/problems/pascals-triangle/submissions/ 思路:使用二维数组,进行开空间和初始化,然后通过规律可知,每个为0的空,等于上一行与本行当前下标相同的那一个加上前一个
class Solution {
public:
vector<vector<int>> generate(int numRows)
{
//创建一个二维数组
vector<vector<int>> arr;
//创建行数
arr.resize(numRows);
//进行初始化给值,并且每行里面多少个数
for(size_t i = 0;i < numRows;i++)
{
//先给每行里面的数组进行开空间
arr[i].resize(i+1);
//第一个数和最后一个数初始化为1
arr[i].front() = arr[i].back() = 1;
}
//其余的每一个初始化为0的空,都等于上一行的当前下标的数+前一个数
for(size_t i = 0;i < numRows;i++)
{
for(size_t j = 0;j < arr[i].size();j++)
{
if(arr[i][j] == 0)
{
arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
}
}
}
return arr;
}
};
辅助理解图:
三、电话号码的数字组合
力扣https://leetcode.cn/problems/letter-combinations-of-a-phone-number/ 思路:首先初始化数组,然后可以通过下图的递归展开图来理解
class Solution
{
string arr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:
void _letterCombinations(const string& digits,size_t i,string combine_str,vector<string>& vs)
{
if(i == digits.size())
{
vs.push_back(combine_str);
return;
}
string str = arr[digits[i] - '0'];//def
for(size_t j = 0;j < str.size();j++)
{
_letterCombinations(digits,i+1,combine_str+str[j],vs);
}
}
vector<string> letterCombinations(string digits)
{
//组合后的字符串
string combine_str;
//最终的字符串数组
vector<string> vs;
if(digits.empty())
{
return vs;
}
//进行组合
_letterCombinations(digits,0,combine_str,vs);//"369" , 3 6 9是i=0 1 2
return vs;
}
};
辅助理解递归图:
本文为学习时的一些练习,如有问题还请各位大佬多多指导。