1. 杨辉三角
C:二维数组要动态开辟
C++:二维数组用vector就行
class Solution{
public:
vector<vector<int>> generate(int numRows){
vector<vector<int>> vv;
//需要初始化所以用resize
vv.resize(numRows);
for (size_t i = 0; i < vv.size(); ++i)
{
//头尾给1,其他给0
vv[i].resize(i+1,0);
vv[i].front() = vv[i].back() = 1;
}
//用下标访问
for (size_t i = 0; i < vv.size(); ++i)
{
for (size_t j = 0; j< vv[i].size(); ++j)
{
if (vv[i][j] == 0)
{
vv[i][j] = vv[i-1][j] + vv[i-1][j-1];
}
}
}
return vv;
}
};
两层嵌套
vector<vector> vv
vv[i][j] -> vv.operator[i]
第一层调用是vv[i],vv.operator[i]返回值是vector
第二层调用vv[i][j],vector.operator[j]返回值是int
2. 删除有序数组中的重复项
题目:
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
链接:力扣(LeetCode)
思路:
C
通过挪动数据
dst与src对比相等src就++
遇到不相等了就先++dst再将src赋值过去
返回数组新长度就是 return dst+1
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int src = 0,dst = 0;
while(src < nums.size())
{
if(nums[src] == nums[dst])
{
++src;
}
else
{
nums[++dst] = nums[src++];
}
}
nums.resize(dst+1);
return dst+1;
}
};
不需要返回值的情况,要将dst之后的数据都删掉
nums.resize(dst+1);
3.电话号码的字母组合
深度优先遍历
数字映射对应的字符串(固定的)
class Solution {
char* numToStr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
//string numToStr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:
//给个子函数进行递归
void Combine(string digits,int di, vector<string>& retV, string combineStr)
{
if(di == digits.size())
{
retV.push_back(combineStr);
return;
}
//取数字字符映射字符串
int num = digits[di] - '0';
string str = numToStr[num];
for(auto ch : str)
{
Combine(digits, di+1, retV, combineStr+ch);
}
}
vector<string> letterCombinations(string digits) {
vector<string> v;
if(digits.empty())
return v;
string str;
Combine(digits, 0, v, str);
return v;
}
};