和为s的两个数字VS和为s的连续正数序列

题一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,是的他们的和正好是s,如有多对,也要找出来。例如输入数组a{1,2,4,7,11,13,15},输出2,13和4,11

思路:定义两个指针left,right,一个指针left指向数组的第一个元素,另一个right指向数组的最后一个元素,默认left为数组的第一个元素,right为数组的第最后一个元素.

a[left]+a[right]>sum,right--

a[left]+a[right]<sum,left++

a[left]+a[right]=sum,打印a[left],a[right]

题二:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如 15=1+2+3+4+5=4+5+6=7+8

思路:定义两个变量small,big,一个变量small初始化为1,另一个big初始化为2,初始序列为就为{1,2},序列和为3。

int middle = (1 + sum) / 2,超过middle后面的值相加肯定比sum大,因此用它来做while循环的边界。

当序列和小于sum时增加队列的个数,即big++;

当序列和大于sum时,删除队列中最小的数,即small++;

当序列和等于sum时,打印small--big之间的数,作为一组结果。

具体参考代码如下:

package test;

import java.util.ArrayList;

public class Solution {
    /**
     * 输入一个递增排序的数组和一个数字s,在数组中查找两个数,是的他们的和正好是s,如有多对,也要找出来。
     * @param sum
     * @param a
     */
    public void FindNumberWithSum(int sum, int[] a) {
        if (a == null)
            return;
        int left = 0;
        int right = a.length - 1;
        while (left < right) {
            int curSum = a[left] + a[right];
            if (curSum == sum) {
                System.out.println(a[left] + "   " + a[right]);
                left++;
            } else if (curSum > sum) {
                right--;
            } else {
                left++;
            }
        }
    }

    
    /**
     * 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。
     * @param sum
     * @return
     */
    public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        if (sum < 3)
            return result;
        int small = 1;
        int big = 2;
        //超过middle后面的值相加肯定比sum大,因此用它来做while循环的边界
        int middle = (1 + sum) / 2;
        int curSum = small + big;
        while (small < middle) {
            if (curSum == sum) {
                ArrayList<Integer> list = new ArrayList<Integer>();
                for (int i = small; i <= big; i++) {
                    list.add(i);
                }
                result.add(list);
                curSum -= small;
                small++;
            } else if (curSum > sum) {
                curSum -= small;
                small++;
            } else {
                big++;
                curSum += big;
            }
        }
        return result;
    }

    @org.junit.Test
    public void TestFindContinuousSequence() {
        FindContinuousSequence(15);
    }

    @org.junit.Test
    public void TestFindNumberWithSum() {
        int[] a = { 1, 2, 4, 7, 11, 13, 15 };
        FindNumberWithSum(15, a);
    }
}
原文地址:https://www.cnblogs.com/tongkey/p/7943625.html