【每日刷题】Day102
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
[1. 11. 盛最多水的容器 - 力扣(LeetCode)](#1. 11. 盛最多水的容器 - 力扣(LeetCode))
[2. 611. 有效三角形的个数 - 力扣(LeetCode)](#2. 611. 有效三角形的个数 - 力扣(LeetCode))
[3. 和为S的两个数字_牛客题霸_牛客网 (nowcoder.com)](#3. 和为S的两个数字_牛客题霸_牛客网 (nowcoder.com))
1. 11. 盛最多水的容器 - 力扣(LeetCode)
//思路:双指针。
//定义两个指针,left和right,分别指向数组开头元素和最后一个元素。
//计算两指针形成容器的容积,并记录最大值。
//如果left指向的值小于right,则left++向后遍历;如果right指向的值小于left,则right--向前遍历。
//返回记录的最大容积
class Solution {
public:
int maxArea(vector<int>& height)
{
int left = 0,right = height.size()-1,max = 0;
while(left<right)
{
int high = height[left]>height[right]?height[right]:height[left];
int length = right-left;
int volume = high*length;
max = max>volume?max:volume;
if(height[left]<height[right])
left++;
else
right--;
}
return max;
}
};
2. 611. 有效三角形的个数 - 力扣(LeetCode)
//思路:双指针+排序。
//本题如果采用暴力解法,三层循环遍历所有可能的三元组,时间复杂度就太大了,必然会超出时间限制。
//而我们的思路则是在暴力遍历的想法上面进行优化,具体思路看图:
class Solution {
public:
int triangleNumber(vector<int>& nums)
{
int ans = 0;
int max = nums.size()-1;
sort(nums.begin(),nums.end());
//max>=2是因为最少要组成一个三元组
while(max>=2)
{
//寻找能与max组成三角形的二元组
int left = 0;
int right = max-1;
//当left==right,当前max的循环结束
while(left<right)
{
//如果当前left+right都>max,则之间的所有二元组也一定>max
if(nums[left]+nums[right]>nums[max])
{
ans+=(right-left);
right--;
}
//如果left+right<=max,那么left向后遍历
else
left++;
}
max--;
}
return ans;
}
};
3. 和为S的两个数字_牛客题霸_牛客网 (nowcoder.com)
//思路:双指针。
//定义两个指针,left和right,分别指向头尾元素,判断它们的和与sum的关系:
//注:下述操作可行是因为所给的为有序数组
//① 如果val_left + val_right == sum 则返回结果
//② 如果 val_left + val_right > sum 则right--,使val_right减小
//③ 如果 val_left + val_right > sum 则left++,使val_left增大
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum)
{
vector<int> ans;
int left = 0;
int right = array.size()-1;
while(left<right)
{
int val_left = array[left];
int val_right =array[right];
//找到结果,返回结果
if(val_left+val_right==sum)
{
ans.push_back(val_left);
ans.push_back(val_right);
break;
}
//使val_right减小
else if(val_left+val_right>sum)
right--;
//使val_left增大
else
left++;
}
return ans;
}
};