文章目录
- 1、有效三角形的个数
- 2、查找总价格为目标值的两个商品
- 3、三数之和
- 4、四数之和
1、有效三角形的个数
给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int n=nums.size();
int count=0;
sort(nums.begin(),nums.end());
for(int i=n-1;i>=2;i--)
{
if(nums[i]==0)
continue;
int left=0;
int right=i-1;
while(left<right)
{
if(nums[left]+nums[right]>nums[i])
{
count+=(right-left);
right--;
}
else
left++;
}
}
return count;
}
};
2、查找总价格为目标值的两个商品
购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。
class Solution {
public:
vector<int> twoSum(vector<int>& price, int target) {
int n=price.size();
int left=0;
int right=n-1;
while(left<right)
{
if((price[left]+price[right])==target)
return {price[left],price[right]};
else if((price[left]+price[right])<target)
left++;
else
right--;
}
return {};
}
};
3、三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n=nums.size();
sort(nums.begin(),nums.end());
set<vector<int>> ret;
for(int i=0;i<n-2;i++)
{
if(nums[i]>0)
break;
int left=i+1;
int right=n-1;
while(left<right)
{
if((nums[left]+nums[right])==-(nums[i]))
{
ret.insert({nums[i],nums[left],nums[right]});
left++;
right--;
}
else if((nums[left]+nums[right])>-(nums[i]))
right--;
else
left++;
}
}
vector<vector<int>> dummy(ret.begin(),ret.end());
return dummy;
}
};
4、四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int n=nums.size();
set<vector<int>> ret;
sort(nums.begin(),nums.end());
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
int left=j+1;
int right=n-1;
while(left<right)
{
long long sum=(long long)target-nums[i]-nums[j];
if(sum==(nums[left]+nums[right]))
{
ret.insert({nums[i],nums[j],nums[left],nums[right]});
left++;
right--;
}
else if(sum>(nums[left]+nums[right]))
left++;
else
right--;
}
}
}
vector<vector<int>> dummy(ret.begin(),ret.end());
return dummy;
}
};