美文网首页
剑指Offer--和为S的两个数字

剑指Offer--和为S的两个数字

作者: 小北觅 | 来源:发表于2019-01-14 09:44 被阅读6次

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

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

    思路:

    数列满足递增,设两个头尾两个指针i和j,
    1、若ai + aj == sum,就是答案(相差越远乘积越小)
    2、若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1
    3、若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1

    其实主要思想是两个数的乘积要最小,那么这个时候我们就需要知道,当一个有序的序列,两个数相隔越远,最后得到的数最小。所以我们设定两个指针,分别从序列的两头出发。

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
            ArrayList<Integer> result = new ArrayList<Integer>();
            if(array.length==0 || array==null)
                return result;
            
            int left =0;
            int right = array.length-1;
            
            while(left<right && left<=array.length-1 && right>=0){
                
                if(array[left]+array[right]==sum){
                    result.add(array[left]);
                    result.add(array[right]);
                    return result;
                }
                if(array[left]+array[right]<sum){
                    left++;
                }
                
                if(array[left]+array[right]>sum){
                    right--;
                }
                
            }
            return result;
        }
    }
    

    相关文章

      网友评论

          本文标题:剑指Offer--和为S的两个数字

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