剑指--和为s的连续正数序列

刚好复习一下滑动窗口算法。只有做题才能融汇贯通嘛

题链接:https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey

滑动窗口学习算法链接:https://mp.weixin.qq.com/s/ioKXTMZufDECBUwRRp3zaA

方法一:

第一眼思路想到用O(n^2)的DP(动态规划算法)

形状为dp(num, num)

规律dp[i][j] = dp[i][j-1] + data[j]

方法二:

关于子串大名鼎鼎的双指针之——滑动窗口法呀!

直接上代码了

# -*- coding:utf-8 -*-
class Solution:
    #DP
    '''
    def FindContinuousSequence(self, tsum):
        # write code here
        # 连续子和
        # dp
        dp = [[0]*(tsum) for i in range(tsum)]
        #初始化dp
        for i in range(tsum):
            for j in range(tsum):
                if i==j:
                    dp[i][j] = i+1
        re = []
        for i in range(tsum):
            for j in range(i+1,tsum):
                dp[i][j] = dp[i][j-1]+(j+1)
                if dp[i][j] == tsum:
                    re.append(list(range(i+1, j+2)))
        # 找到元素 并返回
        return re
    '''
    
    # 滑动窗口解法
    def FindContinuousSequence(self, tsum):
        data = list(range(1,tsum+1))
        
        left = right = 0
        re = []
        # 窗口元素之和  避免在判断中求sum(list) 这个也许是线性的。
        num = 0
        while left < tsum-1 and right<tsum: # 循环条件可以更加改进一点 left>(tsum-1)就可以退出了!
            # 扩大窗口
            num+=data[right]
            right+=1
            
            while num >= tsum and left < (right-1):#满足基本条件,和>tsum就可以缩小窗口了
                if num == tsum: # 符合条件的结果
                    re.append(data[left:right])
                    break # 退出循环 每个窗口里肯定只有一种满足要求的结果
                # 缩小窗口吧
                num -= data[left]
                left += 1
        return re
            
        
        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值