力扣題目系列:面試題57 - II. 和爲s的連續正數序列

目錄

題目及示例

我的題解

滑動窗口結合數學規律


題目及示例

輸入一個正整數 target ,輸出所有和爲 target 的連續正整數序列(至少含有兩個數)。

序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。

示例 1:輸入:target = 9  輸出:[[2,3,4],[4,5]]
示例 2:輸入:target = 15  輸出:[[1,2,3,4,5],[4,5,6],[7,8]]

限制:1 <= target <= 10^5

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

我的題解

//這個解法空間複雜度很小,但是時間複雜度稍高,因爲沒有利用規律,僅是使用滑動窗口
class Solution {
    public int[][] findContinuousSequence(int target) {
        int start = 1; //開始點,滑動窗口左邊界
        int now = 1; //遊標,滑動窗口右邊界
        int sum = 0;

        List<int[]> list = new ArrayList<>();

        while(start <= target/2){
            while(sum < target){
                sum += now;
                ++now;
            }
            if(sum == target){ //找到一組
                int[] temp = new int[now - start];
                for (int i = 0; i < temp.length; i++) {
                    temp[i] = start + i;
                }
                list.add(temp); //給result賦值 //start到now
                start++; //start = now; //更新開始點
                now = start; //更新遊標
                sum = 0; //重置和
            } else if(sum > target){ //開始點不對
                start++; //start = now; //更新開始點
                now = start; //更新遊標
                sum = 0; //重置和
            }
        }

        int[][] res = new int[list.size()][];
        for (int i = 0; i < res.length; i++) {
            res[i] = list.get(i);
        }
        return res;
    }
}

滑動窗口結合數學規律

//若能發現公式xa+x*(x-1)/2=target,x表示每一個一維數組的個數
//時空複雜度大大降低
class Solution {
    public int[][] findContinuousSequence(int target) {
        int[][] array = new int[target/2][];
		int num = 0;
		for (int i = 0,x=2; i < target/2; x++) {
			int ax = target - x*(x-1)/2;
                if(ax <= 0)
			break;
		if(ax%x == 0){
			num++;
			int a = ax/x;
			array[num-1] = new int[x];
			for (int j = 0; j < x; j++) {
				array[num-1][j] = a + j;
			}
		}
		i++;
	}
	int[][] array1 = new int[num][];
	for (int i = num-1,j = 0; i >= 0; i--,j++) {
		array1[j] = array[i];
	}
	return array1;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章