PAT-Find Coins (25)
2016-03-10 10:15
309 查看
题意:
求两个数和为某个数
解答:
经典2-sum,问题,从一串数里找到两个和为m。做法: 把数组排序,然后用两头扫的办法。
i = 0, j = n - 1
如果a[i] + a[j] < m ,则需要放大, ++i
如果a[i] + a[j] > m, 则需要减小, --j
如果有解,第一次找到的一定是a[i]尽可能小的,这正是题目要求的。
首先最大值和最小值相加大于此值的话,说明最大值肯定不是目标数之一,所以把它拿掉
如果小于此值的话,则应该增幅慢点,所以应该是从小的值的一方向前移动,即使会有错过的组合数,但是排除大的数一端就是因为这个大数和最小值都比原来的值大的话,再小的值过来和它相加也是不可能的
排除小的数过程是先固定大的书,因为此时大数和小数相加小于此值,所以还是有可能的,等小的数移动到某个数后和大值相加大于此值时,则大值又要向前移,如果大值移动后,两数相加大于此值,则继续移动大值,可能会有人说,如果此时不移动大值,而是将小值向前移动会不会出现等于此值的小数,这是不可能的。因为当时一个更大的数和这个小数相加都比此值小,则不可能出现这个小数加上一个小一点的大数和它相加还等于这个小数。
具体的java代码:
求两个数和为某个数
解答:
经典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 ; 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"); } }
相关文章推荐
- view controller内部全部视图旋转
- MongoDB 增量备份方案
- HTML 讲师笔记--第三次试讲
- sql语句获取今天、昨天、近7天、本周、上周、本月、上月、半年数据
- ubuntu 安装 avahi服务
- iOS开发--验证码
- ListView多布局展示bug
- 解决Linux动态链接库的无法加载问题
- jquery提高执行效率(2)
- 第 5 章 事件响应,让网页交互
- drop、delete、truncate、alter表时show processlist出现Waiting for table metadata lock状态
- 对产品管理和产品设计的总结
- 简述c#之sealed 修饰符
- 【分享】4412开发板-嵌入式Linux开发须要掌握的基础知识和技能
- 反射簡單應用例子[轉]
- 2013级软件工程GitHub账号信息
- iOS之获取UITableViewCell中UITextField的关联方法
- 使用Hammer.js操作svg
- STM32_定时器_PWM_笔记
- 判断字符串字节数(中英文)