[Sword refers to offer] 57.2 and two numbers with s

Title description

Insert picture description here
Insert picture description here

// 57.2 和为s的两个数字

// 力扣
// 输入一个正整数 target ,输出所有和为 target 的连续正整数序列
// (至少含有两个数)。

// 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。



// 牛客
// 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上
// 就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续
// 的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正
// 数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快
// 的找出所有和为S的连续正数序列? Good Luck!

answer


// 牛客
// 思路简单,但是能做出来还是不容易的。
// 从前面初始化两个指针left和right,由于至少包含2个数,且必须是正整数
// 所以left初始化为1(left至少为1),right比left大,right至少为2,
// 累计的数组和至少为3,所以初始化累计和sum为3,
// 开始比较sum与target大小,如果sum比target小,需要窗口扩大,right右移
// 右移之后sum累加right,如果sum比target大,需要窗口缩小,left右移,
// sum累减left,之后left再右移(注意是先指针移动还是先操作sum加减)
// 直到sum等于target,将left到right之间所有元素存入新指定的ArrayList中
// 再存入res中。
// 运行时间:15ms,超过87.63%用Java提交的代码
// 占用内存:9984KB超过2.76%用Java提交的代码
import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer>> FindContinuousSequence(int target) {
		ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        if (target < 2)
            return res;
		int left = 1, right = 2;
		int sum = 3;
		while (left < right) {
			if (sum < target) {
				right++;
				sum += right;
			}
			else if (sum > target) {
				sum -= left;
				left++;
			}
			else {
				ArrayList<Integer> list = new ArrayList<>();
				for (int i = left; i <= right; i++) {
					list.add(i);
				}
				res.add(list);
				sum -= left;
				left++;
			}
		}
		return res;
    }
}


// 力扣
// 执行用时:2 ms, 在所有 Java 提交中击败了97.62%的用户
// 内存消耗:36.8 MB, 在所有 Java 提交中击败了17.75%的用户
import java.util.ArrayList;
class Solution {
    public int[][] findContinuousSequence(int target) {
        ArrayList<int[]> res = new ArrayList<>();
        int left = 1, right = 2;
        int sum = 3;
        while (left < right) {
            if (sum < target) {
                right++;
                sum += right;
            }
            else if (sum > target) {
                sum -= left;
                left++;
            }
            else {
                int[] list = new int[right - left + 1];
                int j = 0;
                for (int i = left; i <= right; i++) {
                    list[j++] = i;
                }
                res.add(list);
                sum -= left;
                left++;
            }
        }
        int[][] result = res.toArray(new int[res.size()][]);
        return result;
    }
}

Guess you like

Origin blog.csdn.net/fisherish/article/details/114918112
Recommended