剑指offer-----和为s的两个数字

1、题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

2、思想

方法一:笨方法,时间复杂度O(n^2)

固定一个数字,分别判断该数字和后面的数字和是否等于S。

方法二:好方法,时间复杂度O(n)

定义两个指针,第一个指针指向数组的第一个数字(最小的),第二个指针指向数组的最后一个数字(最大的),如果两个数字的和大于s,则将第二个指针向前移动,否则将第一个指针向前移动。如果两个指针指向同一个数字还没有找到,则说明不存在两个数的和正好为s。将乘积小的两个数替换arraylist中乘积大的两个数。

3、代码实现(方法二实现)

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(array.length <= 0){
            return list;
        }
        int first = 0;
        int last = array.length-1;
        
        while(first < last){
            int s = array[first] + array[last];
            if(s > sum){
                last--;
            }else if(s < sum){
                first++;
            }else{
                if(list.size() > 0){
                    if(array[first]*array[last] < list.get(0)*list.get(1)){
                        list.set(0,array[first]);
                        list.set(1,array[last]);
                    }
                }else{
                    list.add(array[first]);
                    list.add(array[last]);
                    
                }
                first++;
                last--;
                
            }
        }
        return list;
        
    }
}

猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/80892415