Leetcode打卡 Day1--978

这里写自定义目录标题

978

练习Python3的第一天

题目

当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组:

若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。

返回 A 的最大湍流子数组的长度。

示例 1:

输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])
示例 2:

输入:[4,8,12,16]
输出:2
示例 3:

输入:[100]
输出:1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-turbulent-subarray

解答

动态规划问题
如果长度小于2,则返回1
否则建立动态规划数组
进行迭代

  1. 法1
    class Solution:
    def maxTurbulenceSize(self, arr: List[int]) -> int:
    if len(arr) == 1 or min(arr) == max(arr): return 1
    dp = [1 for _ in range(len(arr))]
    for i in range(1,len(arr)-1):
    if (arr[i] - arr[i-1]) * (arr[i]-arr[i+1]) > 0:
    dp[i] = dp[i-1] + 1
    return max(dp) + 1

  2. 法2-flag法
    def maxTurbulenceSize(A):
    “”"
    1. dp问题: 这里我们不应该关注数值本身, 而是应该关注变化的趋势.
    所以, 对于A = [9,4,2,10,7,8,8,1,9], 变更为: [-1, -1, 1, -1, 1, 0, -1, 1]
    A[i+1]>A[i], 则为1, A[i+1]=A[i], 则为0, 否则为-1
    2. dp[i] = dp[i-1] + 1, 如果nums[i], nums[i-1]为1, -1.(代表上升下降, 或者下降上升)
    dp[i] = 1, 如果nums[i] == nums[i-1](代表上升上升, 或者下降下降)
    dp[i] = 0, 如果nums[i] = 0(代表之前的两数相等)
    “”"
    if len(A) == 1:
    return 1
    nums = []
    for i in range(1, len(A)):
    v = A[i] - A[i-1]
    nums.append(1 if v > 0 else 0 if v == 0 else -1)
    print(nums)
    dp = [0 for _ in range(len(nums))]
    dp[0] = 0 if nums[0] == 0 else 1
    for i in range(1, len(nums)):
    if nums[i] == 0:
    dp[i] = 0
    elif nums[i] + nums[i-1] == 0:
    dp[i] = dp[i-1] + 1
    else:
    dp[i] = 1

    return max(dp) + 1

print(maxTurbulenceSize([9,4,2,10,7,8,8,1,9]))

作者:leicj
链接:https://leetcode-cn.com/problems/longest-turbulent-subarray/solution/python3-zui-chang-tuan-liu-zi-shu-zu-by-leicj/
来源:力扣(LeetCode)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值