《剑指offer第二版》面试题57 题目二:和为s的连续正数序列

2020-02-28  本文已影响0人  castlet

题目描述

解题思路

  1. 用连个数small和end表示序列的最小值和最大值。small到big序列的连续和用sum表示。
  2. 如果sum大于s,则small增加。
  3. 如果sum小于s,则增加big。
  4. 如果sum等于s,则保存这个序列。此时再增大end。
  5. 因为序列里至少有连个数字,则small能增加到的最大值是(1+s)/2。

代码

ArrayList<ArrayList<Integer>> findContinuousSequences(int sum){
    if (sum <= 2) {
        return null;
    }
    ArrayList<ArrayList<Integer>> result = new ArrayList<>();
    int begin = 1;
    int end = 2;

    int curSum = begin + end;
    while (begin <= (sum + 1) / 2 && begin < end) {
        if (curSum > sum) {
            curSum = curSum - begin;
            begin ++;
        } else if (curSum < sum) {
            end ++;
            curSum = curSum + end;
        } else {
            result.add(createList(begin, end));
            end ++;
            curSum = curSum + end;
        }
    }
    return result;
}
ArrayList<Integer> createList(int start , int end) {
    ArrayList<Integer> list = new ArrayList<>();
    while (start <= end) {
        list.add(start);
        start ++;
    }
    return list;
}
上一篇 下一篇

猜你喜欢

热点阅读