返回介绍

solution / 0300-0399 / 0376.Wiggle Subsequence / README

发布于 2024-06-17 01:04:01 字数 3523 浏览 0 评论 0 收藏 0

376. 摆动序列

English Version

题目描述

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

  • 例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。

  • 相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。

给你一个整数数组 nums ,返回 nums 中作为 摆动序列 最长子序列的长度

 

示例 1:

输入:nums = [1,7,4,9,2,5]
输出:6
解释:整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3) 。

示例 2:

输入:nums = [1,17,5,10,13,15,10,5,16,8]
输出:7
解释:这个序列包含几个长度为 7 摆动序列。
其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8) 。

示例 3:

输入:nums = [1,2,3,4,5,6,7,8,9]
输出:2

 

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000

 

进阶:你能否用 O(n)_ _时间复杂度完成此题?

解法

方法一

class Solution:
  def wiggleMaxLength(self, nums: List[int]) -> int:
    up = down = 1
    for i in range(1, len(nums)):
      if nums[i] > nums[i - 1]:
        up = max(up, down + 1)
      elif nums[i] < nums[i - 1]:
        down = max(down, up + 1)
    return max(up, down)
class Solution {
  public int wiggleMaxLength(int[] nums) {
    int up = 1, down = 1;
    for (int i = 1; i < nums.length; ++i) {
      if (nums[i] > nums[i - 1]) {
        up = Math.max(up, down + 1);
      } else if (nums[i] < nums[i - 1]) {
        down = Math.max(down, up + 1);
      }
    }
    return Math.max(up, down);
  }
}
class Solution {
public:
  int wiggleMaxLength(vector<int>& nums) {
    int up = 1, down = 1;
    for (int i = 1; i < nums.size(); ++i) {
      if (nums[i] > nums[i - 1]) {
        up = max(up, down + 1);
      } else if (nums[i] < nums[i - 1]) {
        down = max(down, up + 1);
      }
    }
    return max(up, down);
  }
};
func wiggleMaxLength(nums []int) int {
  up, down := 1, 1
  for i := 1; i < len(nums); i++ {
    if nums[i] > nums[i-1] {
      up = max(up, down+1)
    } else if nums[i] < nums[i-1] {
      down = max(down, up+1)
    }
  }
  return max(up, down)
}
function wiggleMaxLength(nums: number[]): number {
  let up = 1,
    down = 1;
  for (let i = 1; i < nums.length; ++i) {
    let prev = nums[i - 1],
      cur = nums[i];
    if (cur > prev) {
      up = Math.max(up, down + 1);
    } else if (cur < prev) {
      down = Math.max(down, up + 1);
    }
  }
  return Math.max(up, down);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文