输入一个递增排序的数组和数字s在数组中查找两个数,使得他们的和恰好为s

输入一个递增排序的数组和数字s在数组中查找两个数,使得他们的和恰好为s。如果有多对数字的和等于s,输出两个数的乘积最小的

分析

定义一个数组a,按递增排好序,给定一个值num = 4,求数组a里两数之和等于num
在这里插入图片描述
这是一个递增排序的数组,要求其中两数的和等于给定的值,如果a[l] + a[r] > num,说明大了,r左移,l不动
在这里插入图片描述
发现还是大了,r继续左移,直到
在这里插入图片描述
在l = 0,r = 3处时满足a[l] + a[r] = num,找到目标值。那么是不是积最小的呢?
两数差越大,积越小
首先,一个逐渐递增的数组从两边向中间遍历,指针对应的数的差是不断变小的,积是不断变大的。比如在 1 2 2 3 5中,求等于4的两个数且他们积最小的值。当遍历到1和3时就满足了条件,这两个数差最大,就可以跳出循环,根本不会遍历到 2 2.

实现

package OJ;
import java.util.Scanner;
/**
 * @author Chris
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] a = new int[in.nextInt()];
        int num = in.nextInt();
        int left = 0;
        int right = a.length - 1;
        for (int i = 0; i < a.length; i++) {
            a[i] = in.nextInt();
        }
        while (left < right){
            if(a[left] + a[right] < num){
                left++;
            }else if(a[left] + a[right] > num){
                right--;
            }else{
                break;
            }
        }
        System.out.println(a[left]+" "+right);
    }
}

输出:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值