• LeetCode·376.摆动序列·贪心·动态规划


    链接:https://leetcode.cn/problems/wiggle-subsequence/solution/-by-xun-ge-v-nh8y/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

    题目

     

    示例

     

    思路

    解题思路
    【贪心】

    贪心思维在于局部最优推出全局最优

    对于每一个序列我们都取最大数目时(局部最优),最后的序列一定的最大的(全局最优)

    具体实现看代码,注释超级详细

    【动态规划】
    很容易可以发现,对于我们当前考虑的这个数,要么是作为山峰(即nums[i] > nums[i-1]),要么是作为山谷(即nums[i] < nums[i - 1])。

    • 设dp状态dp[i][0],表示考虑前i个数,第i个数作为山峰的摆动子序列的最长长度
    • 设dp状态dp[i][1],表示考虑前i个数,第i个数作为山谷的摆动子序列的最长长度

    则转移方程为:

    • dp[i][0] = max(dp[i][0], dp[j][1] + 1),其中0 < j < i且nums[j] < nums[i],表示将nums[i]接到前面某个山谷后面,作为山峰。
    • dp[i][1] = max(dp[i][1], dp[j][0] + 1),其中0 < j < i且nums[j] > nums[i],表示将nums[i]接到前面某个山峰后面,作为山谷。

    初始状态:

    由于一个数可以接到前面的某个数后面,也可以以自身为子序列的起点,所以初始状态为:
    dp[i][0] = dp[i][1] = 1。

    代码

    【贪心】

    1. int wiggleMaxLength(int* nums, int numsSize){
    2. int curDiff = 0; // 当前一对差值
    3. int preDiff = 0; // 前一对差值
    4. int result = 1; // 记录峰值个数,序列默认序列最右边有一个峰值
    5. for (int i = 0; i < numsSize - 1; i++) {
    6. curDiff = nums[i + 1] - nums[i];
    7. // 出现峰值
    8. if ((curDiff > 0 && preDiff <= 0) || (preDiff >= 0 && curDiff < 0)) {
    9. result++;
    10. preDiff = curDiff;
    11. }
    12. }
    13. return result;
    14. }
    15. 作者:xun-ge-v
    16. 链接:https://leetcode.cn/problems/wiggle-subsequence/solution/-by-xun-ge-v-nh8y/
    17. 来源:力扣(LeetCode)
    18. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    【动态规划】

    1. int wiggleMaxLength(int* nums, int numsSize){
    2. int dp[numsSize][2];//定义dp数组
    3. for (int i = 0; i < numsSize; ++i)//枚举数组元素
    4. {
    5. dp[i][0] = dp[i][1] = 1;
    6. for (int j = 0; j < i; ++j)//更新dp数组
    7. {
    8. if (nums[j] > nums[i]) dp[i][1] = fmax(dp[i][1], dp[j][0] + 1);
    9. if (nums[j] < nums[i]) dp[i][0] = fmax(dp[i][0], dp[j][1] + 1);
    10. }
    11. }
    12. return fmax(dp[numsSize - 1][0], dp[numsSize - 1][1]);
    13. }
    14. 作者:xun-ge-v
    15. 链接:https://leetcode.cn/problems/wiggle-subsequence/solution/-by-xun-ge-v-nh8y/
    16. 来源:力扣(LeetCode)
    17. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    SpringBoot
    r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration
    WSL 2 更改默认安装的 Linux 发行版
    C#泛型委托
    2023年广东省中职网络安全Web渗透测试解析(超详细)
    【面试常见问题】深拷贝与浅拷贝
    正式成为研究生一个月就可以改变一个人
    荷兰量子生态联盟投资110万欧元开发超导量子处理器
    Android好看的动画欢迎界面(附有详细代码)
    pygame的freetype模块
  • 原文地址:https://blog.csdn.net/m0_64560763/article/details/126722438