找两个数和为某个数

问题、输入一个递增排序数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可。

  显然,很快能想到的是使用蛮力法(O(n2)),先固定一个数字,再判断剩下的n-1个数字与它的和是否等于s。这种效率显然有点低,我们可以使用下面比较快的方式,时间复杂度O(n)。

  思路:我们通过两个记录数组的开始位置和结束位置,从数组的尾部开始,求两个数字的和,

    如果两个数的和大于我们需要求的数s,则后面的记录前移一位(因为是排好序的,前移一位,相当于数值减少),再进行判断,

    如果两个数的和小于我们要求的数s,则前面的位置记录后移一位(因为是排好序的,后移一位,相当于数值增加),再进行判断,

    直至找到或者后面或前面的位置记录重合。

代码实现

复制代码
/**
     * 输入一个递增排序数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可。因为java只能
     * 有一个返回值,这里返回了真假,或者可以改成数组,返回查找到的两个数,这里就实现返回是否找到,如果找到就打印出来!
     * @param data 待查找的递增数组
     * @param length 数组长度
     * @param sum 要查找的和
     * @return 是否查找成功!
     */
    public static boolean FindNumberWithSum(int data[],int length,int sum)
    {
        boolean found = false;
        if(length < 1)
        {    
            return found;
        }
        
        int ahead = length -1 ;  //较大数字的下标
        int behind = 0;  //较小数字的下标
        
        while(ahead > behind)
        {
            long curSum = data[ahead] + data[behind];
            
            if(curSum == sum)
            {
                System.out.println("查找成功!两个数为:"+data[ahead]+"," + data[behind]);
                break;
            }
            else if(curSum > sum)
            {
                ahead -- ;
            }
            else
            {
                behind ++;
            }
        }
        return found;
    }
复制代码

 

 

测试:

public static void main(String[] args)
    {
        int[] arr = {1,2,4,7,11,15};
        
        FindSumEqualNum.FindNumberWithSum(arr,arr.length,15);
    }

 

 

结果:

查找成功!两个数为:11,4

转载于:https://www.cnblogs.com/s844876674/p/4684427.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值