题目抽象:给定一个数组,返回两个数字和为sum且乘积最小的两个数字。

和为S的两个数字

http://www.nowcoder.com/questionTerminal/390da4f7a00f44bea7c2f3d19491311b

import java.util.ArrayList;
/*
考察知识点:数学,双指针
思路:因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:
1.初始化:指针i指向数组首, 指针j指向数组尾部
2. 如果arr[i] + arr[j] == sum , 说明是可能解
3. 否则如果arr[i] + arr[j] > sum, 说明和太大,所以--j
4. 否则如果arr[i] + arr[j] < sum, 说明和太小,所以++i
*/
//数学方法
public class Solution {

//数学方法
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
    ArrayList<Integer> list=new ArrayList<>();
    if(array.length==0||array==null) return list;
    int min=0;
    for(int i=0;i<array.length;i++){
        if(array[i]>sum/2) break;
        for(int j=i+1;j<array.length;j++){
            int sum1=array[i]+array[j];
            if(sum1==sum) {
                int val=array[i]*array[j];
                if(min==0||min>val) {
                    min=val;
                    list=new ArrayList<>();
                    list.add(array[i]);
                    list.add(array[j]);
                }
            }
            if(sum1>sum) break;
        }
    }
    return list;
}

//双指针方法:一个指针指向头部,一个指针指向尾部
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
    ArrayList<Integer> list=new ArrayList<>();
    if(array.length==0||array==null) return list;
    int left=0;
    int right=array.length-1;
    int min=0;
    while(left<right && array[left]<=sum/2){
        int sum1=array[left]+array[right];
        if(sum1==sum){
            int val=array[left]*array[right];
            if(min==0||min>val){
                min=val;
                list=new ArrayList<>();
                list.add(array[left]);
                list.add(array[right]);
            }
            left++;right--;
        }
        else if(sum1>sum) right--;
        else left++;
    }
    return list;
}

}

全部评论

相关推荐

程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
迷茫的大四🐶:你这个拿去投央国企吧,投私企包过不了的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务