欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > 算法基础学习Day3(双指针)

算法基础学习Day3(双指针)

2025/3/19 6:50:59 来源:https://blog.csdn.net/2302_82004664/article/details/144318731  浏览:    关键词:算法基础学习Day3(双指针)

在这里插入图片描述

文章目录

  • 1.题目
  • 2.题目解答
    • 题目及题目解析
    • 算法学习
      • 解法一:暴力枚举
      • 解法二:利用单调性,使用双指针解决问题
  • 代码提交

1.题目

  1. 611. 有效三角形的个数 - 力扣(LeetCode)

2.题目解答

题目及题目解析

image-20241207203050025

算法学习

解法一:暴力枚举

image-20241207220036877

class Solution {
public:int triangleNumber(vector<int>& nums) {int num = 0;std::sort(nums.begin(), nums.end());for (int left = 0; left < nums.size(); left++) {for (int right = left + 1; right < nums.size(); right++) {for (int end = nums.size() - 1; end > right; end--) {if (nums[left] + nums[right] > nums[end]) {num++;}}}}return num;}
};

这里的时间复杂度是NlogN+N*3,虽然能过但是还是可以进行优化的

解法二:利用单调性,使用双指针解决问题

这个优化在排完序的基础上

  1. **情况一:**能成为三角形

那么后面从leftright的数都可以组成三角形,直接将这部分的数组进行相加就行

中间的数据个数表达式:right-left

接着让right--

image-20241207221458335

  1. **情况二:**不能成为三角形

那么聪right开始到left的数都没办法组成三角形

直接让left++即可

image-20241207221831559

总结来说,步骤如下:

  1. 先固定最大的数
  2. 用双指针算法快速求解

代码提交

写成代码如下:

class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(), nums.end());int ret = 0;for (int i = nums.size() - 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;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词