使用双指针解决问题题集(二)

1. 有效三角形的个数

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

示例 1:

输入: nums = [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2)
2,2,3 示例 2:

输入: nums = [4,2,3,4] 输出: 4

题解:利用单调性(单调递增)和双指针快速统计三元组个数。这里是利用单调性是指按照升序后一个数据的值是大于前一个数据的。

  1. 首先固定数组中最大的数。
  2. 在最大的数的左半边区间使用双指针算法,快速统计符合要求的三元组个数。
    如图:
    在这里插入图片描述
    在这里插入图片描述
class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());//优化数组
        int size = nums.size();
        int count = 0;
        for(int i =size-1;i>=2;i--)
        {
            int left = 0;
            int right = i-1;
            while(left <right)
            {
                if(nums[left]+nums[right]>nums[i])
                {
                    count += right-left;
                    right--;
                }
                else
                {
                    left++;
                }
            }
        }
        return count;
    }
};

时间复杂度为: O(N2)

2. 查找总价格为目标值的两个商品

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例 1:

输入:price = [3, 9, 12, 15], target = 18 输出:[3,15] 或者 [15,3] 示例 2:

输入:price = [8, 21, 27, 34, 52, 66], target = 61 输出:[27,34] 或者 [34,27]

提示:

1 <= price.length <= 10^5 1 <= price[i] <= 10^6 1 <= target <= 2*10^6

题解: 这道题目也是利用单调性和双指针算法来解决。
思路:
1.首先使用双指针第一个(left)指向数组开始第二个(right)指向数组的结尾。
2.若两个指针指向数据值的和(sum) 大于target,则right–
3.若sum小于target, 则 left++
4. 若是 sum= target ,则返回结果
在这里插入图片描述

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) {
        int size = price.size();
        int left = 0;
        int right = 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};
    }
};

时间复杂度为: O(N)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值