动态规划_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)

猜你喜欢

转载自www.cnblogs.com/lux-ace/p/10546632.html