[leetcode]376. Wiggle Subsequence -- JavaScript代码

Myth丶恋晨 2022-09-24 06:21 213阅读 0赞

这道题目的要求是:
给定一个数组,要求不改变元素顺序,从这个数组里找到一个最长子数组,该子数组中的元素要求一大一小的依次排列。返回值就是这个最长子数组的长度。

这道题给的标签是DP和贪心算法。

PS:代码效率不算很高,欢迎大家改进指正。

JavaScript代码如下:

  1. /** * @param {number[]} nums * @return {number} */
  2. var wiggleMaxLength = function(nums) {
  3. var wiggle = [];
  4. if(nums.length===0){
  5. return 0;
  6. }
  7. if(nums.length==1){
  8. return 1;
  9. }
  10. if(nums[0]>nums[1]){
  11. high = nums[0];
  12. low = nums[1];
  13. flag = 0;// 0表示需要升高,1表示需要下降
  14. }else if(nums[0]<nums[1]){
  15. high = nums[1];
  16. low = nums[0];
  17. flag = 1;// 0表示需要升高,1表示需要下降
  18. }else{
  19. high = low = nums[0];
  20. wiggle.push(nums[0]);
  21. flag = 2;// 2表示未知
  22. }
  23. nums.forEach(function(item){
  24. if(flag===0){
  25. if(item>low){
  26. high = item;
  27. wiggle.push(item);
  28. flag = 1;
  29. }else if(item<low){
  30. low = item;
  31. wiggle.pop();
  32. wiggle.push(item);
  33. }
  34. }else if(flag==1){
  35. if(item<high){
  36. // 需要下降
  37. low = item;
  38. wiggle.push(item);
  39. flag = 0;
  40. }else if(item>high){
  41. high = item;
  42. wiggle.pop();
  43. wiggle.push(item);
  44. }
  45. }else{
  46. if(item>low){
  47. flag = 0;
  48. }else if(item<high){
  49. flag = 1;
  50. }
  51. }
  52. });
  53. return wiggle.length;
  54. };

思路1:首先,要考虑给定数组只有1个或没有元素的特殊情况。

思路2:用flag,high,low来记录数据——flag:现在是需要找比上一个元素大的数字,还是需要找比上一个元素小的数字。high/low:当需要找比上一个元素小(大)的下一个元素的时候,那个用来做比较的“上一个元素 ”。

但是这里,需要一点贪心算法的思路:例如,当我们要寻找比上一个元素小的元素的时候,如果遇到的不是更小的元素,反而是更大的元素,那么我们就应该用这个更大的元素来替代上一个元素。这样,就放宽了对下一个小元素的要求范围,可以期望得到更优的答案。

思路3:需要考虑如果元素都相等要怎么办?这就是flag = 2的作用。

发表评论

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

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

相关阅读

    相关 LeetCode 376. 摆动序列

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