zoukankan      html  css  js  c++  java
  • 【剑指offer】面试题 57. 和为 S 的数字

    面试题 57. 和为 S 的两个数字

    题目一:和为 S 的两个数字

    题目

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

    思路

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

    Java 实现

    import java.util.ArrayList;
    public class 和为 S 的数字 {
        public static ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            if(array==null||array.length<2){
                return list;
            }
            int i = 0,j = array.length-1;
            while(i<j){
                if(array[i]+array[j]==sum){
                    list.add(array[i]);
                    list.add(array[j]);
                    //return list;         //如果只输出乘积最小的,就在这里 return list;即可
                    i++;
                    j++;
                }else if(array[i]+array[j]>sum){
                    j--;
                }else{
                    i++;
                }
            }
            return list;
        }
        public static void main(String[] args) {
            int array[] = {1,2,3,4,5,6,7,8,9,10};
            int sum = 10;
            ArrayList<Integer> list = FindNumbersWithSum(array,sum);
            System.out.println(list);
        }
    }
    

    运行结果
    [1, 9, 2, 8, 3, 7, 4, 6]

    题目二:和为 S 的连续正数序列

  • 相关阅读:
    从左边或右边删除字符串-python 使用lstrip
    MapReduce- 学习9313第一节记录 材料源于百度百科
    138. (待解决)复制带随机指针的链表
    19. 删除链表的倒数第N个节点-链表(leetcode)
    347.前k个高频元素-counter(leetcode)
    python二进制、十进制、8进制、16进制转换(转)
    POJ 1715
    POJ 1306
    POJ 2436
    POJ 2249
  • 原文地址:https://www.cnblogs.com/hgnulb/p/8976072.html
Copyright © 2011-2022 走看看