和为S的两个数字
来源:互联网 发布:朝鲜族吃里扒外知乎 编辑:程序博客网 时间:2024/03/29 16:11
题目
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的.
对应每个测试案例,输出两个数,小的先输出
解题
递增数组,应该用到
两个指针,两次向中间走,计算两个指针指向的两个数的和,等于S就是答案
关于多个的情况
和定,积有最大值,当且仅当数相等时候,各数的差别越大,积越小。
import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { int left = 0; ArrayList<Integer> result = new ArrayList<Integer>(); int right = array.length - 1; while(left < right){ int s = array[left] + array[right]; if( s== sum){ result.add(array[left]); result.add(array[right]); break; }else if(s<sum){ left++; }else{ right--; } } return result; }}
当数组是无须的怎么办?
1.暴力,求出任意两个数的和,等于s的保存,选取乘积最小的返回答案
时间复杂度
2.HashMap,key = sum - array[i],value = i,当Array[j]存在Map中的时候,两个下标对于的数就是答案了。
至于乘积最小要对所有的数据进行判断了
import java.util.ArrayList;import java.util.*;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(); ArrayList<Integer> result = new ArrayList<Integer>(); result.add(-1); result.add(-1); int ab = Integer.MAX_VALUE; for(int i=0;i<array.length;i++){ int a = array[i]; if(map.containsKey(a)){ int b = sum - a; if(a*b < ab){ if(a>b){// 异或交换 b = a ^ b; a = a ^ b; b = a ^ b; } result.set(0,a); result.set(1,b); } }else{ map.put(sum - a,i); } } if(result.get(0) ==-1){ // 不存在的时候返回空 result.clear(); } return result; }}
0 0
- 和为S的两个数字
- 和为S的两个数字
- 找出和为S的两个数字
- 和为S的两个数字
- 【5】和为s的两个数字
- 和为S的两个数字
- 和为s的两个数字
- 和为s的两个数字
- 和为S的两个数字
- 和为S的两个数字
- 和为S的两个数字
- 和为s的两个数字
- 和为s的两个数字
- 牛客网 | 和为S的两个数字
- 和为s的两个数字
- 和为S的两个数字
- 和为S的两个数字
- 和为S的两个数字
- pptx文件怎么打开(ppt兼容包下载)
- 2016年高校保送生拟录取名单(清华大学)
- Yixiaohan---000给头像加上红色数字
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Yeoman创建自己的generator(1)
- 和为S的两个数字
- android:debuggable="true"
- 阿拉伯语、波斯语等RTL语言下部分控件位置不对
- Android 用Animation-list实现逐帧动画
- 一维数组的初始化问题
- 1CISC和RISC的区别联系是什么?2哈佛结构和冯·诺依曼结构的区别
- 先说说我自己
- Openstack liberty 创建实例快照源码分析2
- 类似问题 duplicate entry: com/example/apputils/BuildConfig.class