剑指offer:和为S的连续正数序列
2017-08-18 10:50
309 查看
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
双指针思想
【运行时间:22ms 占用内存:8656k】import java.util.ArrayList; public class Solution { //用到了双指针的思想来实现的 public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> listList=new ArrayList<ArrayList<Integer>>(); //由于是正数序列,因此从1开始 int left=1; int right=2; if(sum<=1) return listList; while(left!=(sum+1)/2){ ArrayList<Integer> list=new ArrayList<Integer>(); int curOfSum=sumOfList(left,right); if(curOfSum==sum){ for(int i=left;i<=right;i++){ list.add(i); } //区间元素等于当前值则前后两个指针均往后移 left++; right++; listList.add(list); }else if(curOfSum<sum){ //当前区间元素和小于sum则右指针往后移 right++; }else{ //当前区间元素和大于sum则左指针往后移 left++; } } return listList; } public static int sumOfList(int front,int rear){ int sum=0; for(int i=front;i<=rear;i++){ sum+=i; } return sum; } }
相关文章推荐
- 剑指offer——和为S的连续正数序列
- 《剑指offer》- 输出所有和为S的连续正数序列
- 剑指offer(38)-和为S的连续正数序列
- 和为S的连续正数序列(剑指offer) 两个个指针的应用
- 剑指offer(21)-和为S的连续正数序列
- 剑指offer(二十二)之和为S的连续正数序列
- 剑指offer 面试题41 和为 s 的两个数字 VS 和为 s 的连续正数序列
- 《剑指Offer》学习笔记--面试题41:和为s的两个数字VS和为s的连续正数序列
- 《剑指offer》-和为S的连续正数序列
- 剑指Offer - 九度1354 - 和为S的连续正数序列
- 剑指Offer:和为 S 的两个数字 VS 和为 S 的连续正数序列
- 剑指offer系列源码-和为S的连续正数序列
- 剑指offer:和为s的两个数字VS和为s的连续正数序列(java)
- 剑指offer 和为S的连续正数序列
- 剑指Offer(Java版):和为s的两个数字VS和为s的连续正数序列
- 剑指offer——面试题:42(二)s的连续正数序列
- 剑指Offer–041-和为S的连续正数序列
- 剑指offer——和为S的连续正数序列(基本思路)
- 《剑指offer》和为s的连续正数序列
- 《剑指offer》和为S的连续正数序列