✨ 个人主页:在线OJ的阿川
💖文章专栏:OJ刷题入门到进阶
🌏代码仓库:
写在开头
现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论
目录
- 1. 题目介绍
- 2. 题目拆解
- 3. 具体详情
- 4. 具体代码
1. 题目介绍
难度:中
题目练习:有效三角形的个数
题目信息:给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。
举个例子: 具体如图1所示
图1 举个例子
2. 题目拆解
本质上:观察规律,利用单调性
特点是:在组合搭配中有一定单调性规律
解决方法:双指针算法,如图2所示
图2 双指针
3. 具体详情
1. 先进行排序
2. 固定其中最大的数,再将最小和第二大数作为双指针对最大数进行比较
3. 两种情况:
- 最小和第二大数之和大于最大数,则中间数与第二大数组合均符合要求,再将第二大树数移动减小
- 最小和第二大数之和小于或等于最大数,则中间数与最小数组合均不符合要求,再将最小数移动增大
4. 最后再将最大数移动减小,直至遍历完整个数组
4. 具体代码
class Solution {
public:
int triangleNumber(vector<int>& nums)
{
// 进行排序
sort(nums.begin(), nums.end());
int sum = 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])
{
sum += right - left;
right--;
}
else
{
left++;
}
}
}
return sum;
}
};
5. 夹带私货
若你能看到看到这篇文章且能看到这,则说明你我有缘,留个关注吧,后面还会接着计算机408、底层原理、开源项目、以及数据、后端研发相关、实习、笔试/面试、秋招/春招、各种竞赛相关、简历相关、考研、学术相关……,祝你我变得更强
好的,到此为止啦,祝您变得更强
道阻且长 行则将至 |
---|
个人主页:在线OJ的阿川大佬的支持和鼓励,将是我成长路上最大的动力 |