1.四数之和
给定一个包含n个整数的数组nums和一个目标值,判断nums中是否存在四个元素a,b,c和d,使得a+b+c+d的值与target相等?找出所有满足条件且不重复的四元组。
思路:把四数之和问题转换为三数之和问题。三数之和外再嵌套一层循环。
vector<vector<int>> fourSum(vector<int>& nums, int target) {
set<vector<int>> s;
vector<vector<int>> res;
sort(nums.begin(), nums.end());
if(nums.size() < 4)
{
return res;
}
for(int m = 0; m < nums.size() - 3; m++)
{
if(m > 0 && nums[m] == nums[m - 1])
{
continue;
}
//三数之和
for(int i = m + 1; i < nums.size() - 2; i++)
{
if(i > m + 1 && nums[i] == nums[i - 1])
{
continue;
}
int j = i + 1;
int k = nums.size() - 1;
while(j < k)
{
if(nums[m] + nums[i] + nums[j] + nums[k] == target)
{
vector<int> temp;
temp.push_back(nums[m]);
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
s.insert(temp);
while(j < k && nums[j + 1] == nums[j])
{
j++;
}
while(j < k && nums[k - 1] == nums[k])
{
k--;
}
j++;
k--;
}
else if(nums[m] + nums[i] + nums[j] + nums[k] < target)
{
j++;
}
else
{
k--;
}
}
}
}
for(set<vector<int>>::iterator it = s.begin(); it != s.end(); it++)
{
res.push_back(*it);
}
return res;
}
2.括号生成
给出n代表生成括号的对数,请你写一个函数,使其能够生成所有可能的并且有效的括号组合。
思路:动态规划。n在n-1字符串的基础上,可以将加在外层,加在左边,遇到(加“()”
vector<string> generateParenthesis(int n) {
if(n == 0)
{
return {""};
}
if(n == 1)
{
return {"()"};
}
vector< vector<string> > dp(2);
dp[0] = {""};
dp[1] = {"()"};
for(int i = 2; i <= n; i++)
{
vector<string> res;
vector<string> temp = dp[i -1];
set<string> s;
for(int j = 0; j < temp.size(); j++)
{
s.insert("(" + temp[j] + ")");
s.insert("()" + temp[j]);
for(int k = 0; k < temp[j].length(); k++)
{
if(temp[j][k] == '(')
{
s.insert(temp[j].substr(0, k + 1) + "()" + temp[j].substr(k + 1));
}
}
}
for(set<string>::iterator it = s.begin(); it != s.end(); it++)
{
res.push_back(*it);
}
dp.push_back(res);
}
return dp[n];
}