PAT-Find Coins (25)

来源:互联网 发布:健体与健美的区别 知乎 编辑:程序博客网 时间:2024/05/22 12:44

题意:

求两个数和为某个数

解答:

经典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");            }}



0 0
原创粉丝点击