【leetcode千题】剑指 Offer 57 - II. 和为s的连续正数序列

    科技2022-08-06  109

    输入一个正整数 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

    思路:暴力

    设fx = sum(1,2,。。。x) target = fx2-fx1 遍历x2,哈希x1 复杂度n

    class Solution: def findContinuousSequence(self, target: int) -> List[List[int]]: d = {} ans =[] for i in range(target+1): d[((1+i)*i)//2] = i for i in range(1,target+1): if (1+i)*i//2 - target in d.keys(): if d[(1+i)*i//2 - target] < i-1: #print(d[(1+i)*i//2 - target],i) ans.append([i for i in range(d[(1+i)*i//2 - target]+1,i+1)]) return ans

    思路2:双指针滑动窗口

    class Solution: def findContinuousSequence(self, target: int) -> List[List[int]]: l = 1 r = 2 n = target//2 +1 ans = [] while l != r: if (l+r)*(r-l+1)//2 == target: ans.append([i for i in range(l,r+1)]) r+=1 elif (l+r)*(r-l+1)//2 > target: l+=1 else: r+=1 return ans
    Processed: 0.109, SQL: 8