双指针_和为s的两个数_C++

1.题目解析


题目链接:https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/

题目要求,输出一个可能的结果即可。这个结果以数组的形式输出,元素的顺序无所谓。

2.算法原理


2.1解法一:暴力枚举


[2, 7, 11, 15, 19, 21]为例,依次让2+7,2+11,2+15,…,然后让7+11,7+15,7+19,…依次类推,总能找到可能的结果。

用来两层for循环就可以实现。

伪代码:

for(i = 0; i < n; i++)
	for(j = i + 1; j < n; j++)
		check(nums[i] + nums[j] == t)

为什么暴力方法这么慢?因为它没有利用题中数组的一个特性,数组是有序的。


2.2解法二:利用单调性,使用双指针算法解决


先弄两个指针:(目标值是30)

在这里插入图片描述

如图,2和21相加为23,小于30,那么2和21中间的那一堆数还有必要和2相加吗?答案是没有必要,因为数组是单调递增的,所以2和中间那一堆数相加结果一定小于目标值30。

由此,我们可以发现规律:令sum = nums[left] + nums[right]

1)sum > t:令right--

2)sum < t:令left++

3)sum = t:找到了结果


3.代码演示


class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target)
    {
        int n = price.size();
        int left = 0;
        int right = n - 1;
        while(left < right)
        {
            if(price[left] + price[right] > target)
                right--;
            else if(price[left] + price[right] < target)
                left++;
            else return {price[left], price[right]};
        }

        // 配合编译器
        return{-1, -1};
    }
};

注意:虽然我们知道这道题如果不写return{-1, -1}也是一定会有返回结果的,但是编译器不这么认为。它觉得如果你的if条件不成立,那么这个函数是永远没有返回值结果的,所以我们在该函数的最后再随便返回点什么东西就行了,当然这句代码也是没有执行的机会的。这是leedcode的特色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-指短琴长-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值