PAT-Find Coins (25)

本文介绍了解决2-sum问题的经典算法,即从一组有序数中找到两个数,使其和等于给定的目标值。通过排序和双指针技术实现高效查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

求两个数和为某个数

解答:

经典2-sum,问题,从一串数里找到两个和为m。做法: 把数组排序,然后用两头扫的办法。
i = 0, j = n - 1
如果a[i] + a[j] < m ,则需要放大, ++i
如果a[i] + a[j] > m, 则需要减小, --j
如果有解,第一次找到的一定是a[i]尽可能小的,这正是题目要求的。

首先最大值和最小值相加大于此值的话,说明最大值肯定不是目标数之一,所以把它拿掉

如果小于此值的话,则应该增幅慢点,所以应该是从小的值的一方向前移动,即使会有错过的组合数,但是排除大的数一端就是因为这个大数和最小值都比原来的值大的话,再小的值过来和它相加也是不可能的

排除小的数过程是先固定大的书,因为此时大数和小数相加小于此值,所以还是有可能的,等小的数移动到某个数后和大值相加大于此值时,则大值又要向前移,如果大值移动后,两数相加大于此值,则继续移动大值,可能会有人说,如果此时不移动大值,而是将小值向前移动会不会出现等于此值的小数,这是不可能的。因为当时一个更大的数和这个小数相加都比此值小,则不可能出现这个小数加上一个小一点的大数和它相加还等于这个小数。

具体的java代码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
       
        int N=in.nextInt();
        int M=in.nextInt();
        int[] a=new int[N];
       
        for(int i=0;i<N;i++){
            a[i]=in.nextInt();
        }
        Arrays.sort(a);
        int i=0,j=N-1;
        while(i<j){
            if(a[i]+a[j]<M){
                i++;
            }
            else if(a[i]+a[j]>M){
                j--;
            }
            else{
                System.out.print(a[i]+" "+a[j]);
                return;
            }
        }
      System.out.print("No Solution");
        
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值