美文网首页
剑指 offer 笔记 42 | 和为S的两个数字

剑指 offer 笔记 42 | 和为S的两个数字

作者: ProudLin | 来源:发表于2019-11-11 16:27 被阅读0次

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

    输出描述:

    对应每个测试案例,输出两个数,小的先输出。

    思路分析
    题目其实隐藏着一个信息,两个数位置相差越远,乘积则越小。所以我们可以用两个指针「左右夹逼」的方式,慢慢找出答案。

    解释说明:

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            if (array == null || array.length < 2) {
                return list;
            }
            int low = 0;//低位指针,从头开始
            int  hight = array.length-1;//高位指针,从末端开始
            while(low < hight){
                if( array[low]+array[hight] == sum){
                list.add(array[low]);
                list.add(array[hight]);
                    return list;
               }else if( array[low]+array[hight] > sum){ //大于sum,说明太大了,hight左移寻找更小的数
                    hight--;
                }else{ //如果和小于sum,说明太小了,low 右移寻找更大的数
                    low++;
                }
                 
            }
            return list;
        }
    }
    

    链接:https://www.nowcoder.com/questionTerminal/390da4f7a00f44bea7c2f3d19491311b?f=discussion
    来源:牛客网

    相关文章

      网友评论

          本文标题:剑指 offer 笔记 42 | 和为S的两个数字

          本文链接:https://www.haomeiwen.com/subject/vivtictx.html