【贪心】 LeetCode376. 摆动序列

古城微笑少年丶 2022-12-03 13:21 261阅读 0赞

题目

在这里插入图片描述

解答

  1. #include <iostream>
  2. #include <string>
  3. #include <list>
  4. #include <vector>
  5. #include <cassert>
  6. // 376. Wiggle Subsequence
  7. // 贪心算法,在数列上升的时候,要选取最大的值,这样就更容易找到比它小的下一个值,从而得到差为负数。
  8. // 如果数列在下降的时候,就选取最小的值,这样就更容易找到比它大的下一个值,从而得到差为正数。
  9. // 这个题可以使用数形结合的思路,实际就是一个求极值点的问题。
  10. // 巧妙运用状态机则可以求得极值点。
  11. int wiggleMaxLength(const std::vector<int>& nums) {
  12. const int BEGIN_STATE = 0;
  13. const int UP_STATE = 1; // 上升状态
  14. const int DOWN_STATE = 2; // 下降状态
  15. // 下降和上升状态的转化点就是极值点。
  16. if (nums.size() <= 1) {
  17. return nums.size();
  18. }
  19. int max_len = 1;
  20. int state = BEGIN_STATE;
  21. for (std::size_t i = 1; i < nums.size(); ++i) {
  22. int difference = nums[i] - nums[i-1];
  23. switch (state) {
  24. case BEGIN_STATE:
  25. if (difference < 0) {
  26. ++max_len;
  27. state = UP_STATE;
  28. } else if (difference > 0) {
  29. ++max_len;
  30. state = DOWN_STATE;
  31. }
  32. break;
  33. case UP_STATE:
  34. if (difference > 0) {
  35. ++max_len;
  36. state = DOWN_STATE;
  37. }
  38. break;
  39. case DOWN_STATE:
  40. if (difference < 0) {
  41. ++max_len;
  42. state = UP_STATE;
  43. }
  44. break;
  45. }
  46. }
  47. return max_len;
  48. }
  49. int main() {
  50. std::cout << wiggleMaxLength({ 1, 2, 3 }) << std::endl;
  51. std::cout << wiggleMaxLength({ 1, 2, 1 }) << std::endl;
  52. std::cout << wiggleMaxLength({ 1, 2, 1, 1, 3, 4, 5, 6, 4, 7 }) << std::endl;
  53. std::cout << wiggleMaxLength({ 1, 2, 2, 3, 3, 4, 5, 6}) << std::endl;
  54. std::cout << wiggleMaxLength({ 88 }) << std::endl;
  55. std::cout << wiggleMaxLength({ 0, 0 }) << std::endl;
  56. std::cout << wiggleMaxLength({ }) << std::endl;
  57. return 0;
  58. }

发表评论

表情:
评论列表 (有 0 条评论,261人围观)

还没有评论,来说两句吧...

相关阅读

    相关 贪心算法-leetcode376.摆动序列

    问题描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。 例如, \

    相关 贪心——376. 摆动序列

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

    相关 LeetCode 376. 摆动序列

    解题思路 时间复杂度并不理想,没有想到使用波峰,波谷的o(n)算法。 这个dp也还勉强可以通过。 思路就是先计算出差值,然后对差值数组进行dp即可。 代码