2021寒假每日一题《找硬币》

找硬币

题目来源:PAT甲级真题1048
时间限制:1000ms 内存限制:64mb

题目描述

伊娃喜欢从整个宇宙中收集硬币。
有一天,她去了一家宇宙购物中心购物,结账时可以使用各种硬币付款。
但是,有一个特殊的付款要求:每张帐单,她只能使用 恰好 两个硬币来 准确 的支付消费金额。
给定她拥有的所有硬币的面额,请你帮她确定对于给定的金额,她是否可以找到两个硬币来支付。

输入格式

第一行包含两个整数 N N N M M M,分别表示硬币数量以及需要支付的金额。
第二行包含 N N N 个整数,表示每个硬币的面额。

输出格式

输出一行,包含两个整数 V 1 V_1 V1, V 2 V_2 V2,表示所选的两个硬币的面额,使得 V 1 ≤ V 2 V_1 ≤ V_2 V1V2 并且 V 1 + V 2 = M V_1 + V_2 = M V1+V2=M
如果答案不唯一,则输出 V 1 V_1 V1 最小的解。
如果无解,则输出 No Solution

数据范围

1 ≤ N ≤ 1 0 5 1 ≤ N ≤ 10^5 1N105,
1 ≤ M ≤ 1000 1 ≤ M ≤ 1000 1M1000

样例输入1

8 15
1 2 8 7 2 4 11 15

样例输出1

4 11

样例输入2

7 14
1 8 7 2 4 11 15

样例输出2

No Solution

解题思路:左右指针

需要首先对给定的硬币数组进行排序。
排序后将左指针指向数组的首项,右指针指向尾项。

如果两个指针所指的硬币加起来大于了需要支付的金额,则将右指针向左移动一格。
如果两个数加起来小于支付金额,则左指针向右移。
直到他们加起来与支付金额相等,则跳出循环。
当循环结束,没有找到加起来与支付金额相等的结果,则输出 No Solution

先对给定的硬币数组进行排序,然后定义两个指针,分别指向最小和最大。
假设数组为a,两个指针分别为left、right,就有以下情况
{ 1. a [ l e f t ] + a [ r i g h t ] > m , 两 者 相 加 比 金 额 大 , 说 明 右 指 针 所 指 的 值 大 了 , 需 要 将 右 指 针 左 移 一 项 。 2. a [ l e f t ] + a [ r i g h t ] < m , 两 者 相 加 比 金 额 小 , 说 明 左 指 针 的 值 小 了 , 将 左 指 针 右 移 一 项 。 3. a [ l e f t ] + a [ r i g h t ] = = m , 两 者 相 加 等 于 金 额 , 则 找 到 了 所 需 值 。 \begin{cases} 1.a[left] + a[right] > m , 两者相加比金额大,说明右指针所指的值大了,需要将右指针左移一项。 \\ 2.a[left] + a[right] < m , 两者相加比金额小,说明左指针的值小了,将左指针右移一项。 \\ 3.a[left] + a[right] == m , 两者相加等于金额,则找到了所需值。 \end{cases} 1.a[left]+a[right]>m,2.a[left]+a[right]<m,3.a[left]+a[right]==m,

解题代码-Java

import java.util.*;

public class Main {
     
    public static void main(String[] args) {
     
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int m = input.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
     
            a[i] = input.nextInt();
        }
        input.close();
        Arrays.sort(a);
        int v1 = -1, v2 = -1;
        int left = 0, right = n - 1;  //左右两个指针
        while (left < right) {
     
            if (a[left] + a[right] == m) {
     
                v1 = a[left];
                v2 = a[right];
                break;
            } else if (a[left] + a[right] > m) {
     
                right--;
            } else {
     
                left++;
            }
        }
        if (v1 >= 1) {
     
            System.out.printf("%d %d\n", v1, v2);
        } else {
     
            System.out.println("No Solution");
        }
    }
}

你可能感兴趣的:(2021寒假每日一题,java,算法,排序,指针)