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

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

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

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

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

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

 

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

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

int middle = (1 + sum) / 2,超过middle后面的值相加确定比sum大,所以用它来作while循环的边界。队列

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

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

当序列和等于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);
    }
}
相关文章
相关标签/搜索