• 动态规划_leetcode376


    #coding=utf-8

    # 递归
    class Solution1(object):
    def wiggleMaxLength(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """

    self.res = 0

    # 这是一个坑
    ans = []
    self.tryWiggle(nums,0,ans)

    return self.res

    def tryWiggle(self,nums,index,ans):

    if index == len(nums):
    if self.isWiggle(ans):
    self.res = max(self.res,len(ans))
    return

    ans.append(nums[index])
    self.tryWiggle(nums,index+1,ans)
    ans.pop()
    self.tryWiggle(nums,index+1,ans)


    def isWiggle(self,ans):

    if len(ans) <= 2:
    return True

    first = ans[0]
    second = ans[1]



    if second > first:
    flag = True
    else:
    flag = False

    pre = second


    if flag == True:
    for index in range(2,len(ans)):

    if index % 2 == 0 and ans[index] >= pre:
    return False

    if index % 2 == 1 and ans[index] <= pre:
    return False


    pre = ans[index]

    return True

    if flag == False:
    for index in range(2, len(ans)):

    if index % 2 == 0 and ans[index] <= pre:
    return False

    if index % 2 == 1 and ans[index] >= pre:
    return False

    pre = ans[index]

    return True




    # s = Solution1()
    #
    # nums1 = [1,7,4,9,2,5]
    # nums2 = [1,4,7,2,5]
    # nums3 = [1,7,4,5,5]
    # nums4 = [1,7,4,9,2,5]
    #
    # # print s.isWiggle(nums1)
    # # print s.isWiggle(nums2)
    # # print s.isWiggle(nums3)
    # # print s.isWiggle(nums4)
    #
    # print s.wiggleMaxLength(nums4)


    # 组合
    class Solution2(object):
    def wiggleMaxLength(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """

    self.res = 0

    # 这是一个坑
    ans = []
    self.tryWiggle(nums, 0, ans)

    return self.res

    def tryWiggle(self, nums, index, ans):

    if index == len(nums):
    if self.isWiggle(ans):
    self.res = max(self.res, len(ans))
    return

    ans.append(nums[index])
    self.tryWiggle(nums, index + 1, ans)
    ans.pop()
    self.tryWiggle(nums, index + 1, ans)

    def isWiggle(self, ans):

    if len(ans) <= 2:
    return True

    first = ans[0]
    second = ans[1]

    if second > first:
    flag = True
    else:
    flag = False

    pre = second

    if flag == True:
    for index in range(2, len(ans)): if index % 2 == 0 and ans[index] >= pre: return False if index % 2 == 1 and ans[index] <= pre: return False pre = ans[index] return True if flag == False: for index in range(2, len(ans)): if index % 2 == 0 and ans[index] <= pre: return False if index % 2 == 1 and ans[index] >= pre: return False pre = ans[index] return Trues = Solution2()nums1 = [1,7,4,9,2,5]nums2 = [1,4,7,2]#coding=utf-8# 递归class Solution1(object): def wiggleMaxLength(self, nums): """ :type nums: List[int] :rtype: int """ self.res = 0 # 这是一个坑 ans = [] self.tryWiggle(nums,0,ans) return self.res def tryWiggle(self,nums,index,ans): if index == len(nums): if self.isWiggle(ans): self.res = max(self.res,len(ans)) return ans.append(nums[index]) self.tryWiggle(nums,index+1,ans) ans.pop() self.tryWiggle(nums,index+1,ans) def isWiggle(self,ans): if len(ans) <= 2: return True first = ans[0] second = ans[1] if second > first: flag = True else: flag = False pre = second if flag == True: for index in range(2,len(ans)): if index % 2 == 0 and ans[index] >= pre: return False if index % 2 == 1 and ans[index] <= pre: return False pre = ans[index] return True if flag == False: for index in range(2, len(ans)): if index % 2 == 0 and ans[index] <= pre: return False if index % 2 == 1 and ans[index] >= pre: return False pre = ans[index] return True# s = Solution1()## nums1 = [1,7,4,9,2,5]# nums2 = [1,4,7,2,5]# nums3 = [1,7,4,5,5]# nums4 = [1,7,4,9,2,5]## # print s.isWiggle(nums1)# # print s.isWiggle(nums2)# # print s.isWiggle(nums3)# # print s.isWiggle(nums4)## print s.wiggleMaxLength(nums4)# 组合class Solution2(object): def wiggleMaxLength(self, nums): """ :type nums: List[int] :rtype: int """ self.res = 0 # 这是一个坑 ans = [] self.tryWiggle(nums, 0, ans) return self.res def tryWiggle(self, nums, index, ans): if self.isWiggle(ans): self.res = max(self.res, len(ans)) if index == len(nums): return for i in range(index,len(nums)): ans.append(nums[index]) self.tryWiggle(nums,i+1,ans) ans.pop() def isWiggle(self, ans): if len(ans) <= 2: return True first = ans[0] second = ans[1] if second > first: flag = True else: flag = False pre = second if flag == True: for index in range(2, len(ans)): if index % 2 == 0 and ans[index] >= pre: return False if index % 2 == 1 and ans[index] <= pre: return False pre = ans[index] return True if flag == False: for index in range(2, len(ans)): if index % 2 == 0 and ans[index] <= pre: return False if index % 2 == 1 and ans[index] >= pre: return False pre = ans[index] return True# s = Solution2()## nums1 = [1,7,4,9,2,5]# nums2 = [1,4,7,2]# nums3 = [1,7,4,5,5]# nums4 = [1,7,4,9,2,5]## # print s.isWiggle(nums1)# # print s.isWiggle(nums2)# # print s.isWiggle(nums3)# # print s.isWiggle(nums4)## print s.wiggleMaxLength(nums2)# 动态规划# 定义一个二元组,分别作为递增递减序列的标记为# 还可以通过动态规划的思路来解决问题。# 用up[i]和down[i]分别记录到第i个元素为止以上升沿和下降沿结束的最长“摆动”序列长度,遍历数组,如果nums[i]>nums[i-1],表明第i-1到第i个元素是上升的,因此up[i]只需在down[i-1]的基础上加1即可,而down[i]保持down[i-1]不变;# 如果nums[i]<nums[i-1],表明第i-1到第i个元素是下降的,因此down[i]只需在up[i-1]的基础上加1即可,而up[i]保持up[i-1]不变;如果nums[i]==nums[i-1],则up[i]保持up[i-1],down[i]保持down[i-1]。比较最终以上升沿和下降沿结束的最长“摆动”序列长度即可获取最终结果。# ---------------------# 作者:TstsUgeg# 来源:CSDN# 原文:https://blog.csdn.net/tstsugeg/article/details/52025712# 版权声明:本文为博主原创文章,转载请附上博文链接!# 难的是状态的定义呀class Solution3(object): def wiggleMaxLength(self, nums): """ :type nums: List[int] :rtype: int """ if not nums: return 0 up = [1 for i in range(len(nums))] down = [1 for i in range(len(nums))] for i in range(1,len(nums)): if nums[i] > nums[i-1]: up[i] = down[i-1]+1 down[i] = down[i-1] elif nums[i] < nums[i-1]: down[i] = up[i-1]+1 up[i] = up[i-1] else: up[i] = up[i-1] down[i] = down[i-1] return max(up[len(nums)-1],down[len(nums)-1])s = Solution3()nums1 = [1,7,4,9,2,5]nums2 = [1,4,7,2]nums3 = [1,7,4,5,5]nums4 = [1,7,4,9,2,5]nums5 = [0,0]print s.wiggleMaxLength(nums5)
  • 相关阅读:
    我的JAVA之旅(二)初识JAVA
    ORACLE并发处理
    我的JAVA之旅(一)安装配置
    我的JAVA之旅(三) 元素语法
    改变一生的五句话
    InstallShield集成安装MSDE2000最小版本(三) fishout特许授权发布
    IS2009修改XML File 奕婷特许授权发布
    SQL Server中多个表格求出相同列和不同列(答案来自CSDN上SQL专家的回答)
    InstallShield集成安装MSDE2000最小版本(二) fishout特许授权发布
    Installshield停止操作系统进程的代码 IS6及以上版本适用
  • 原文地址:https://www.cnblogs.com/lux-ace/p/10546632.html
Copyright © 2020-2023  润新知