双指针去解决盛最多的水的问题
其实有点类似与尺取法,去解决一个由有两个应变量的问题(个人理解)
public:
int maxArea(vector<int>& height) {
int a=0,b;
int ans=0;
b=height.size()-1;
while(a<b)
{
if(height[a]<height[b])
{ ans=max(ans,(b-a)*height[a]) ; a++;}
else
{ ans=max(ans,(b-a)*height[b]) ;b--;}
}
return ans;
}
};
三数求和
暴力问题,但是我最开始的想法是o(n³),这会导致输出中包含着重复的顺序不同而已的答案,然后看到别人进行排序,来回使用双指针去压整个数组,才恍然大悟
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
int n = nums.size();
sort(nums.begin(),nums.end());
for(int i = 0; i < n; ++i){
if(i > 0 && nums[i] == nums[i-1]){
continue;
}
int l = i + 1;
int r = n - 1;
while(l < r){
while(l > i+1 && l < r && nums[l] == nums[l-1]){
l++;
}
while(r < n-2 && l < r && nums[r] == nums[r+1]){
r--;
}
if(l < r){
int sum = nums[i] + nums[l] + nums[r];
if(sum == 0){
vector<int> t;
t.push_back(nums[i]);
t.push_back(nums[l]);
t.push_back(nums[r]);
ans.push_back(t);
l++;
r--;
}else if(sum < 0){
l++;
}else{
r--;
}
}
}
}
return ans;
}
};