单调数组对的题目 II
单调数组对的题目 II(hard)
做题过程
一开始我想的是用 双指针为基础的优化算法 ,然后感觉不太对,后面绝对可以试试看 多维动态规划(二维) ,又想了一下就没深思,就跳过去了,最后突然觉得 回溯 应该能写,结果还应该是 多维动态规划 。
总之, 没做出来 。
算法概述
本题要求为给出一个数组,求出由两个非严格递增和非严格递减的数组相加能得到对应索引元素的可能有多少。使用 二维动态规划 。
- 时间复杂度为O(nm):n为数组长度,m为最大值
- 空间复杂度为O(nm):同上
JAVA
1 | class Solution { |
C++
1 | // 总体思路是一样的 |
总结
这道题最妙的地方就是把原本一个需要考虑 三个数组相对关系和递增性要求 的复杂问题通过 将二维边界设置为最大值,内层循环每次只考虑当前元素取值的总可能数 的做法构建了子问题结构,从而在利用 动态规划计算前后相对关系 的同时,又 避免了需要向前回溯 的开销。
还需要注意的是:
- 解法中 只是考虑递增数组 ,外层遍历 只计算前后元素差值 ,不涉及子问题结构
- 同时
int d = Math.max(0, nums[i] - nums[i - 1]);
杜绝了因为目标数组降序排列而导致访问空元素的可能
前缀和,迭代(继承),二维动态规划
- Title: 单调数组对的题目 II
- Author: tobegold574
- Created at : 2024-11-29 20:53:58
- Updated at : 2024-12-02 18:57:29
- Link: https://tobegold574.me/2024/11/29/单调数组对的题目-II-每日一题-in-leetcode/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments