和为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的保存,选取乘积最小的返回答案
时间复杂度O(N2)
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
原创粉丝点击