🙉专栏推荐:Java入门知识🙉
🐹今日诗词:雾失楼台,月迷津渡🐹
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
题目描述
题目链接: 611. 有效三角形的个数
题目分析
正常思路(暴力解法)
遍历所有可能情况, 判断出能够成三角形的情况, 并记录下来
缺点: 复杂度较高, 并且容易超时
双指针算法
三角形: 任意两边之和大于第三边,
如果我们对数组进行排序, 只需要看最小的值大于第三边就可以了
因此我们固定最大值, 移动较小值,
比如2 2 3 4, 固定最大值, 可以构成三个三角形,
那么如何遍历出这三种情况呢?
我们定义三个指针, left, right, cur
固定cur指针, 移动左右两个指针
right = 3时有两张情况, 2 3 4(第一个2),2 3 4(第二个2)
此时记录三角形的个数, 个数等于 right - left ,然后继续right--继续遍历
右边指针移动的时机
当符合三角形判断条件移动右指针左移: 也就是左右指针对应元素和大于cur元素
右指针移动的时机
当不符合三角形判断条件移动右指针左移
编写代码
class Solution { public int triangleNumber(int[] nums) { Arrays.sort(nums); // 记录个数 int result = 0; for (int cur = nums.length - 1; cur >= 2; cur--) { int left = 0; int right = cur - 1; while (left < right) { if (nums[left] + nums[right] > nums[cur]) { // 符合三角形判断条件, right--, 继续看还有没有符合的 result += right - left; right--; } else { // 说明两边和小于第三边, left+1, 加过之后看两边能不能大于第三边 left++; } } } return result; } }
复杂度分析
美图分享
✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄
⭐️点赞收藏加关注,学习知识不迷路⭐️
🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️