序列中求和等于特定数----two pointers

给定递增正整数序列和目标和M,寻找序列中两数之和等于M的所有组合。通过双指针技巧,初始设置i=i, j=n-1,根据a[i]+a[j]与M的比较结果更新i或j,找到所有满足条件的方案。" 107297112,8746737,2020低压电工考试复习资料与模拟试题,"['电工考证', '低压电工', '培训资料', '安全规程']

题目描述
给定一个递增的正整数序列和一个正整数M,求序列中的两个不同位置的数a和b,使得他们的和恰好为M,输出所有满足条件的方案。

解题思路:令下标i的值初值为i,下标j的值为n-1
(1)如果满足a[i]+a[j]==M,说明找到了一组方案。由于序列递增,不等式a[i+1]+a[j]>M或者a[i]+a[j-1]<M均成立,但是对于a[i+1]+a[j-1]与M的大小未知,所以只能在[i+1,j-1]区间内继续产生,所以i++,j–.
(2)如果满足a[i]+a[j]<M,那么a[i]+a[j-1]<M是成立的,但是a[i+1]+a[j]与M的大小无法确定,需要在[i+1,j]区间内产生,所以i++
(3)如果满足a[i]+a[j]>M,那么a[i+1]+a[j]>M是成立的,但是a[i]+a[j+1]与M的大小无法确定,需要在[i,j-1]区间内产生,所以j–.

题解核心代码

void solve()
{
    while(i<j)
    {
        if(a[i]+a[j]==M)
        {
            printf("%d %d\n",i,j);
            i++;
            j++;
        }
        else if(a[i]+a[j]<M)
        {
            i++;
        }
        else
        {
            j++;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

工程人永远在路上

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

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

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

打赏作者

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

抵扣说明:

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

余额充值