剑指offer--(7)和为S的连续整数序列--Java描述

写在前面:

    这个问题的基本思路是,定义两个指针,指针small指向序列的最小值,big指向序列的最大值。设置一个初始值current=small+big。

    (1)当current<sum的时候,我们要增加big的值。

    (2)当current>sum的时候,我们要增加small的值。

注意:最外层循环while的条件是small值的大小,由于至少为两个值,所以small<(sum+1)/2

代码实现:

package test7;

import java.util.ArrayList;

public class Solution2 {
	public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
		ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
		// 定义两个指针
		int small = 1;
		int big = 2;
		int current = small + big;
		// 因为至少有两个数,所以small要小于sum/2
		int mid = (sum + 1) / 2;
		// while的循环条件是small要小于sum/2
		while (small < mid) {
			while (current > sum && small < mid) {
				current = current - small;
				small++;
			}
			if (current == sum) {
				// 将序列保存到一个新的list集合中,并将这个list保存到listAll集合中
				ArrayList<Integer> list = new ArrayList<Integer>();
				for (int i = small; i <= big; i++) {
					list.add(i);
				}
				listAll.add(list);
			}
			// 如果小于sum
			big++;
			current = current + big;
		}
		return listAll;
	}
}

总结:

      此外,这道题还有变形《和为S的两个数字》,我会在后面的文章中为大家总结。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值