输入一个递增排序的数组array和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。
数据范围:
0<=len(array)<=105
1<=array[i]<=106
[1,2,4,7,11,15],15
[4,11]
返回[4,11]或者[11,4]都是可以的
[1,5,11],10
[]
不存在,返回空数组
[1,2,3,4],5
[1,4]
返回[1,4],[4,1],[2,3],[3,2]都是可以的
import java.util.*;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array, int sum) {
int n = array.length;
ArrayList<Integer> res = new ArrayList<>();
int l = 0;
int r = n - 1;
while (l < r) {
int curSum = array[l] + array[r];
if (curSum == sum) {
res.add(array[l]);
res.add(array[r]);
return res;
}
if (curSum < sum) {
l++;
} else {
r--;
}
}
return res;
}
} import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array, int sum) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
if (array[i] + array[j] == sum && i != j) {
list.add(array[i]);
list.add(array[j]);
return list;
}
}
}
return list;
}
} import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> ans = new ArrayList<Integer>();
int n =array.length;
if(n < 2) return ans;
int left = 0, right = n - 1;
while(left < right && left < n && right < n){
if(array[left] + array[right] > sum) {
right--;
}else if(array[left] + array[right] < sum){
left++;
}else{
ans.add(array[left]);
ans.add(array[right]);
break;
}
}
return ans;
}
} import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> a =new ArrayList<>();
int i=0,j=array.length-1;
while(i<j){
if(array[i]+array[j]==sum){
a.add(array[i]);
a.add(array[j]);
break;
}
if(array[i]+array[j]>sum) j--;
if(array[i]+array[j]<sum) i++;
}
return a;
}
} //和数组的排序有点像
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list=new ArrayList<>();
if(array==null||array.length<2){
return list;
}
int l=0;
int r=array.length-1;
while(r>l){
int s=array[l]+array[r];
if(s==sum){
break;
}else if(s>sum){
r--;
}else{
l++;
}
}
if(array[l]+array[r]==sum){
list.add(array[l]);
list.add(array[r]);
}
return list;
}
} import java.util.*;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
int end_cur=array.length-1;
while(end_cur>=0){
if(array[end_cur]>=sum){
end_cur--;
}else{
break;
}
}
ArrayList<Integer> rst=new ArrayList<>();
//确定了数组取值的
label1:for(int cur=end_cur;cur>=0;cur--){
for(int cur_1=0;cur_1<cur;cur_1++){
if(array[cur]+array[cur_1]==sum){
rst.add(array[cur]);
rst.add(array[cur_1]);
break label1;
}
}
}
return rst;
}
} import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array, int sum) {
ArrayList<Integer> res = new ArrayList<Integer>();
int l = 0;
int r = array.length - 1;
while (l < r) {
int temp = array[l] + array[r];
if (temp < sum) {
l++;
} else if (temp > sum) {
r--;
} else {
res.add(array[l]);
res.add(array[r]);
break;
}
}
return res;
}
} import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
// 两个指针:一头一尾
// 定义返回
ArrayList<Integer> ret = new ArrayList<Integer>();
// 边界值
if(array.length==0 || array == null)
return ret;
// 定义双指针
int left=0;
int right=array.length-1;
// 循环判定
while(left<right){
// 如果两个指针所指数字和大于sum,则right指针左移
if(array[left]+array[right]>sum){
right-=1;
}
// 如果两个指针所指数字和小于sum,则left指针右移
else if(array[left]+array[right]<sum){
left+=1;
}
// 如果刚好等于,记录,返回
else{
ret.add(array[left]);
ret.add(array[right]);
return ret;
}
}
return ret;
}
} import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
// 哈希法
// 定义返回
ArrayList<Integer> ret = new ArrayList<Integer>();
// 边界
if(array.length==0||array==null){
return ret;
}
// 定义hashmap
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
// 边循环,边记录,边判定
for(int i=0;i<array.length;i++){
// 如果map已经记录过b的value了,说明b作为a出现过
if(map.containsKey(array[i]) && map.get(array[i]) == sum-array[i]){
ret.add(sum-array[i]);
ret.add(array[i]);
return ret;
}
// 存储时候和if判定的顺序调过来,key是b,value是a
map.put(sum-array[i],array[i]);
}
return ret;
}
} import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<>();
if (array.length == 0 || sum == 0)
return list;
for (int i = 0; i < array.length; i++){
int temp = sum - array[i];
if (list.isEmpty()){
for (int j = i + 1; j < array.length; j++){
if (temp == array[j]){
list.add(array[i]);
list.add(array[j]);
}
}
}
}
return list;
}
} 来个复杂版本:设计一个类,用于对map映射。
然后其操作就是两数之和。空间o(n),时间o(n)...
import java.util.*;
public class Solution {
private class Num{
int base;
int time;
Num(int base){
this.base = base;
this.time = 1;
}
void setTime(int time){
this.time = time;
}
int getTime(){
return this.time;
}
}
public ArrayList FindNumbersWithSum(int [] array,int sum) {
ArrayList res = new ArrayList();
ArrayList > resArray = new ArrayList();
Map kv = new HashMap();
for(int i=0;i<array.length;++i){
Num num = new Num(array[i]);
if(kv.get(array[i])!=null){
Num temp = kv.get(array[i]);
int t = temp.getTime();
temp.setTime(++t);
}
else
kv.put(array[i],num);
}
for(int i=0;i<array.length;++i){
if(kv.get(array[i])!=null&&kv.get(sum-array[i])!=null){
Num temp = kv.get(array[i]);
int t = temp.getTime();
if(t>1){
temp.setTime(--t);
}
else
kv.remove(array[i]);
if(kv.get(sum-array[i])!=null){
ArrayList tempa = new ArrayList();
tempa.add(array[i]);
tempa.add(sum-array[i]);
resArray.add(tempa);
}
}
}
int k,v,mul;
if(resArray.size()==0)return res;
else {
k = resArray.get(0).get(0);
v = resArray.get(0).get(1);
mul = k*v;
}
for(int i=0;i<resArray.size();++i){
int t1 = resArray.get(i).get(0);
int t2 = resArray.get(i).get(1);
if(mul> t1*t2)
{ k = t1;
v = t2;
mul=k*v;
}
}
res.add(k);res.add(v);
return res;
}
}
import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
int n = array.length;
ArrayList<Integer> ans = new ArrayList<Integer>();
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i < n;i++){
if(map.containsKey(sum-array[i])){
ans.add(sum-array[i]);
ans.add(array[i]);
}
map.put(array[i],i);
}
int min = Integer.MAX_VALUE,index = 0,index1 = 1;
if(ans.size() > 2){
for(int i = 0;i < ans.size()-1;i+=2){
if(ans.get(i)*ans.get(i+1) < min){
min = ans.get(i)*ans.get(i+1);
index = i;
index1 = i+1;
}
}
ArrayList<Integer> res = new ArrayList<Integer>();
res.add(ans.get(index));
res.add(ans.get(index1));
return res;
}
return ans;
}
} import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
int cur = 0;
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> ans = new ArrayList<>();
ArrayList<Integer> res = new ArrayList<>();
for (int i = 0; i < array.length; i++) {
if (ans.contains(sum - array[i])) {
cur = array[i] * (sum - array[i]);
list.add(sum - array[i]);
list.add(array[i]);
}
ans.add(array[i]);
}
if (list.size() == 0) return new ArrayList<>();
res.add(list.get(list.size() - 2));
res.add(list.get(list.size() - 1));
return res;
}
} /*
思路:
1.有序2.两个数
所以天然的首位双指针,low和high。
和小了,low右移。和大了,high左移。
low从前往后找,第一个就是乘积最小的。
简单的证明:
x*y最小。x+y=s。所以y=s-x。
x*y=x*(s-x)=-x^2-s*x。
为关于x的开口向下的抛物线。所以最小值就是x最小的时候取得。
也就是low从前往后第一个符合条件的结果。
*/
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> resList = new ArrayList<>();
int low = 0,high = array.length-1,lastProduct = 1;
while(low < high){
int nowSum = array[low] + array[high];
if(nowSum < sum){
low++;
}else if(nowSum > sum){
high--;
}else{
//low从前往后找,第一个就是乘积最小的。
resList.add(array[low]);
resList.add(array[high]);
break;
}
}
return resList;
} public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
int left = 0;
int right = array.length - 1;
ArrayList<Integer> integers = new ArrayList<>();
while (left < array.length && right >= 0 && right > left) {
int ans = array[left] + array[right];
if (ans == sum) {
integers.add(array[left]);
integers.add(array[right]);
break;
} else if (ans > sum) {
right--;
} else {
left++;
}
}
return integers;
} import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
if(array == null || array.length == 0) {
return new ArrayList<>(0);
}
Integer x = null, y = null;
ArrayList<Integer> ans = new ArrayList<>();
int i = 0, j = array.length-1;
int multiply = Integer.MAX_VALUE;
while(i < j) {
if(array[i] + array[j] == sum) {
int temp = array[i] * array[j];
if(temp < multiply) {
multiply = temp;
x = array[i];
y = array[j];
}
i++;
} else if(array[i] + array[j] < sum) {
i++;
} else {
j--;
}
}
if(x == null || y == null) {
return ans;
}
ans.add(x);
ans.add(y);
return ans;
}
} import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> result = new ArrayList<Integer>();
if(null == array || array.length==0) return result;
//双指针解法
int left = 0;
int right = array.length-1;
//左右指针逼近
while(left<right){
int cur = array[left]+array[right];
if(cur < sum){
left++;
}else if(cur > sum){
right--;
}else{
result.add(array[left]);
result.add(array[right]);
break;
}
}
return result;
}
} //两个数离得越近,乘积越大,所以外层乘积小于内层乘积
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list=new ArrayList<>();
int i=0;
int j=array.length-1;
while(i<j){
if(array[i]+array[j]<sum){
i++;
}else if(array[i]+array[j]>sum){
j--;
}else{
list.add(array[i]);
list.add(array[j]);
break;
}
}
return list;
}
} import java.util.ArrayList;
import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> a = new ArrayList<Integer> (2);
Arrays.sort(array);
int temp1 = 0;
int temp2 = 0;
int flag = 0;
for(int i = 0; i<array.length; i++){
for(int j = i+1;j<array.length;j++){
if(array[i]+array[j]==sum && flag==0){
temp1 = array[i];
temp2 = array[j];
flag++;
break;
}
}
}
if(temp1!=0&&temp2!=0){
a.add(temp1);
a.add(temp2);
return a;
}else
return a;
}
} 很简单哦~
typedef vector<int> vi; class Solution { public: vi FindNumbersWithSum(const vi& a,int sum) { vi res; int n = a.size(); int i = 0, j = n - 1; while(i < j){ if(a[i] + a[j] == sum){ res.push_back(a[i]); res.push_back(a[j]); break; } while(i < j && a[i] + a[j] > sum) --j; while(i < j && a[i] + a[j] < sum) ++i; } return res; } };