区域和检索 - 数组不可变
方法二: 缓存
1 | class NumArray { |
注意,在上面的代码中,我们插入了一个虚拟 0 作为 sum 数组中的第一个元素。这个技巧可以避免在 sumrange 函数中进行额外的条件检查。
1 | class NumArray { |
注意,在上面的代码中,我们插入了一个虚拟 0 作为 sum 数组中的第一个元素。这个技巧可以避免在 sumrange 函数中进行额外的条件检查。
1 | class Solution { |
dp[i]表示i最少可以由几个平方数构成。
初试化dp=[0,1,2,..., n],长度为n+1,最多次数就是全由1构成。
遍历dp,对于i,遍历区间[1,n]:
遍历所有平方数小于i的数j,遍历区间[1, sqrt(i)]
动态转移方程:
dp[i] = min(dp[i], dp[i - j * j]+1),i表示当前数字,j*j表示平方数
时间复杂度:O(n*sqrt(n))
空间复杂度:O(n)
1 | class Solution { |
注意:不能只保存到当前为止的最大值,还需保存到当前为止的最小值,因为若下一个数是负数,那么以前的最小值(若为负数)会变成现在的最大值.
1 | class Solution { |
1 | /** |
转自:
作者:labuladong 链接:https://leetcode-cn.com/problems/next-greater-element-ii/solution/dan-diao-zhan-jie-jue-next-greater-number-yi-lei-2/ 来源:力扣(LeetCode)
同样是 Next Greater Number,现在假设给你的数组是个环形的,如何处理?
首先,计算机的内存都是线性的,没有真正意义上的环形数组,但是我们可以模拟出环形数组的效果,一般是通过 % 运算符求模(余数),获得环形特效:
1 | int[] arr = {1,2,3,4,5}; |
回到 Next Greater Number 的问题,增加了环形属性后,问题的难点在于:这个 Next 的意义不仅仅是当前元素的右边了,有可能出现在当前元素的左边。
我们可以考虑这样的思路:将原始数组 “翻倍”,就是在后面再接一个原始数组,这样的话,按照之前“比身高”的流程,每个元素不仅可以比较自己右边的元素,而且也可以和左边的元素比较了。
时间复杂度:O(n)
空间复杂度:O(n)
1 | class Solution { |
以下内容转载自:
作者:reals 链接:https://leetcode-cn.com/problems/house-robber-iii/solution/san-chong-fang-fa-jie-jue-shu-xing-dong-tai-gui-hu/ 来源:力扣(LeetCode)
本题目本身就是动态规划的树形版本,通过此题解,可以了解一下树形问题在动态规划问题解法 我们通过3个方法不断递进解决问题