剑指Offer之和为S的连续正数序列
2018-03-14 10:17
411 查看
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
思路:
连续和的问题,可以只遍历到S的一半,因为超过一半就不可能和为S。
设置一个start,一个end
当和小于S时,增加end;
当和等于S时,添加到list中,并且start和end都加1,且将和减去start;
当和大于S时,和减去start并且增加start
我是从后往前遍历,这样不好是最后得将list逆序。但是也懒得改了。
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
思路:
连续和的问题,可以只遍历到S的一半,因为超过一半就不可能和为S。
设置一个start,一个end
当和小于S时,增加end;
当和等于S时,添加到list中,并且start和end都加1,且将和减去start;
当和大于S时,和减去start并且增加start
我是从后往前遍历,这样不好是最后得将list逆序。但是也懒得改了。
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> allList = new ArrayList<>(); if(sum < 0 || sum == 1){ return allList; } int end = sum / 2 + 1; int start = end; int count = 0; while(start > 0){ if(count < sum){ count += start; if(count == sum) { ArrayList<Integer> list = new ArrayList<>(); int i = start; while(i <= end){ list.add(i++); } allList.add(list); count -= (end--); --start; continue; 4000 } --start; } else if(count > sum){ count -= (end--); } } Collections.reverse(allList); return allList; } }
相关文章推荐
- 剑指offer---和为S的连续正数序列
- 【剑指Offer】面试题41:和为s的连续正数序列
- 剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
- 剑指offer:和为S的连续正数序列
- 剑指Offer----面试题41(2):和为s的连续正数序列
- 剑指offer面试题之和为S的连续正数序列
- 剑指Offer学习总结-和为S的连续正数序列
- 剑指offer 41 - 和为s的两个数字VS为s的连续正数序列
- 剑指offer面试题41_2 和为s的连续正数序列(java实现)
- [剑指offer]和为S的连续正数序列
- 剑指offer 41. 和为s的两个数字VS和为s的连续正数序列
- 剑指Offer之 - 和为s的两个数字 VS 和为s的连续正数序列
- 剑指Offer40 和为s的连续正数序列
- 剑指Offer——和为S的连续正数序列
- 剑指offer-和为S的连续正数序列
- 【剑指offer】面试题41-和为S的两个数VS和为S的连续正数序列
- 剑指offer——和为s的两个数字VS和为s的连续正数序列
- 剑指Offer——输入正整数S,打印出所有和为S的连续正数序列(至少含有两个正数)
- 码农小汪剑指Offer之39-和为S的连续正数序列
- 【剑指offer】面试题57(2):和为S的连续正数序列