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
- PAT-Find Coins (25)
- 1048. Find Coins (25)-PAT
- 【PAT】1048. Find Coins (25)
- PAT 1048. Find Coins (25)
- pat 1048. Find Coins (25)
- PAT 1048. Find Coins (25)
- PAT-A1048. Find Coins (25)
- PAT 1048. Find Coins (25)
- PAT A1048. Find Coins (25)
- pat 1048. Find Coins (25)
- PAT (Advanced) 1048. Find Coins (25)
- PAT甲 1048. Find Coins (25)
- PAT(A) - 1048. Find Coins (25)
- 【PAT甲级】1048. Find Coins (25)
- 1048. Find Coins (25) PAT 甲级
- PAT(甲级)1048. Find Coins (25)
- PAT甲级练习1048. Find Coins (25)
- PAT甲级1048. Find Coins (25)
- MongoDB 增量备份方案
- Python&Eclipse环境搭建
- ASP.NET学习资料
- a
- andriod6.0低功耗模式(关闭wifi、蓝牙、gps、屏幕亮度等)
- PAT-Find Coins (25)
- Vim如何保存需要root权限的文件
- spring 事务管理不起作用原因分析与解决
- string拼接和StringBuilder性能对比
- 【util】工具类方法 总结
- 九个酒迷喝醉酒
- 关于request.getServletPort()获取访问地址的说明
- vijos P1067 守望者的烦恼
- iOS猜拳游戏源码