题目链接:
题目描述:

题目示例:

暴力枚举的方法还是不在这里展示了,大家可以自己写写,但是肯定是过不了的
先将数组排序。
判断三角形的优化方法:
根据【上述优化思想】我们可以固定一个【最长边】,然后在比这条边小的有序数组中找出一个二元组,使得这个二元组之和大于这个最长边。由于数组是有序的,我们可以利用【双指针】来优化
设最长边枚举到 i 位置 ,区间 【left,right】 是 i 位置左边的区间(也就是比它小的区间):
1.如果 nums[left] + nums[right] > nums[i];
2.如果 nums[left] + nums[right] <= nums[i]
class Solution {
public:
int triangleNumber(vector<int>& nums)
{
//优化
sort(nums.begin(),nums.end());
//利用双指针
int ret=0,n=nums.size();
for(int i=n-1;i>=2;i--)
{
int left=0,right=i-1;
while(left<right)
{
if(nums[left]+nums[right]>nums[i])
{
ret+=right-left;
right--;
}
else
{
left++;
}
}
}
return ret;
}
};博主笔记(字迹有点丑,请大家见谅):

题目链接:
题目描述:

题目示例:

暴力枚举还是会超时,这里就不展示了。
注意到本题是升序的数组,因此可以用【对撞指针】优化时间复杂度。
算法流程:(附带算法分析,为什么可以使用对撞指针):
1.初始化 left,right 分别指向数组的左右两端(这里不是我们理解的指针,而是数组的下标)
2.当 left < right 的时候,一直循环
2.1当 nums[left] + nums[right] == target 时,说明找到结果,记录结果,并且返回;
2.2当 nums[left] + nums[right] < target 时:
3.当 nums[left] + nums[right] > target 时。同理我们可以舍去 nums[right],让 right-- ,继续比较下一组数据,而 left 指针不变
class Solution {
public:
vector<int> twoSum(vector<int>& price, int target)
{
int left=0,right=price.size()-1;
while(left<=right)
{
int sum=price[left]+price[right];
if(sum>target) right--;
else if(sum<target) left++;
else return {price[left],price[right]};
}
//照顾编译器
return {-1,-1};
}
};博主笔记(字迹有点丑,请大家见谅):

往期回顾:
【优选算法必刷100题】第001~002题(双指针算法):移动零、复写零问题
【优选算法必刷100题】第003~004题(双指针算法):快乐数和盛水最多的容器
总结:本篇博客介绍了两个基于双指针算法的高效解题方法。强调排序预处理和指针移动策略在优化算法中的关键作用。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持