11.盛最多水的容器
核心思路:
class Solution {
public:
int maxArea(vector<int>& height) {
int left=0,right=height.size()-1,tmp=0;
while(left<right)
{
int v=min(height[left],height[right])*(right-left);
tmp=max(tmp,v);
if(height[left]<height[right])
{
left++;
}
else{
right--;
}
}
return tmp;
}
};
有效三角形的个数
class Solution {
public:
int triangleNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size();
int sum=0;
for(int i=n-1;i>1;i--)
{
int left=0,right=i-1;
while(left<right)
{
if(nums[left]+nums[right]>nums[i])
{
sum+=right-left;
right--;
}
else
{
left++;
}
}
}
return sum;
}
};//不同的也行
查找总价格为目标值的两个商品
class Solution {
public:
vector<int> twoSum(vector<int>& price, int target) {
int n=price.size();
int left=0,right=n-1;
while(left<right)
{
if(price[left]+price[right]>target)
{
right--;
}
else if(price[left]+price[right]<target)
{
left++;
}
else
{
return {price[left],price[right]};
}
}
return{-1,-1};
}
};
三数之和
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> ret;
sort(nums.begin(),nums.end());
int n=nums.size();
for(int i=0;i<n;)
{
if(nums[i]>0) break;
int left=i+1,right=n-1;
while(left<right)
{
if(nums[left]+nums[right]<-nums[i])
{
left++;
}
else if(nums[left]+nums[right]>-nums[i])
{
right--;
}
else
{
ret.push_back({nums[i],nums[left],nums[right]});
left++;right--;
while(left<right&& nums[left]==nums[left-1]) left++;
while(left<right&& nums[right]==nums[right+1])right--;
}
}
i++;
while(i<n&&nums[i]==nums[i-1]) i++;
}
return ret;
}
};
四数之和
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> ret;
sort(nums.begin(),nums.end());
int n=nums.size();
for(int i=0;i<n;)
{
for(int j=i+1;j<n;)
{
int left=j+1,right=n-1;
long long sum=(long long) nums[i]+nums[j];
while(left<right)
{
if(sum+nums[left]+nums[right]>target) right--;
else if(sum+nums[left]+nums[right]<target) left++;
else
{
ret.push_back({nums[i],nums[j],nums[left],nums[right]});
left++;right--;
while(left<right&&nums[left]==nums[left-1])
{
left++;
}
while(left<right&&nums[right]==nums[right+1])
{
right--;
}
}
}
j++;
while(j<n&&nums[j]==nums[j-1])
{
j++;
}
}
i++;
while(i<n&&nums[i]==nums[i-1])
{
i++;
}
}
return ret;
}
};