使用golang进行阶梯,如果[]int是nil,那么range下来是直接跳过的,所以可以返回[]int{nil},这样可以少了很多逻辑判断。
,
这两个都是比较常规的找出子项就行,动态规划中由低向上。
这道丑数,要看到每次都次寻找最小的,新生成的可判断的数字,是由已生成的数字乘上235得到的,所以维护三个索引就可以,可以定位每一个应该寻找的最小的数。
这道一开始想法动态规划从上往下,其实是错的,目前做过的都是从下往上,不要以为做的都是无用功,其实这种解法才是比较合适的。还少了记录相关的值。
两种方法
n^2的解法还是比较常规的,从低开始往上,每一个index都要遍历[0,index-1]中所有可能,因为该范围中最好结果是最长的加上1,最差是最长结果,中间结果是次差的加上一。
nlogn的解法细节看
后者用到了Arrays.binarySearch(int[] nums.int fromIndex,int toIndex,int target),其中toIndex依旧表示未算入的边界,但是可以容纳from=to=0这种情况。得到的结果如果找得到返回原数组的index从0开始的索引,如果找不到返回应该所处的位置从1开始的索引。
同上类似
解法比较简单,就是存储所有【0,i】的和
在初始化阶段和计算阶段都可以使用动态原理,再优化方案可以减少ifelse的判断次数。
个人想法还是传统解法,从底开始,【i,end】表示从i开始到结束时的最大利润,i-1天计算,如果选择buy,那么遍历后面所有卖的情况加上卖的那天往后推两天的利润,如果不选择buy,那么就是i开始到结束的利润。所以从后往前算起。这样时间复杂度是n^2
最优解是时间复杂度为n,空间复杂度为1 。
前继状态其实可以有多种,这道题我们看到每天决策的时候根据前一天有关,前一天共有三种情况分别是买,卖,保留,那么下一天可根据这三种情况作出决策。
最优解和我的想法影响因素在于,我总是先决策,然后根据我的决策再去寻找往后的适应我决策应该有的需求。比如这道题正向决策,如果我选择买,那我就需要过两天后的dp最优利润。如果我选择保留,我需要过一天的dp最优利润。 我卖的决策取决于我先买然后遍历所有可能卖的情况。
那么最优解呢,先让它自动决策,比如我在处理第i天,那么i-1天有什么情况,可能是买卖保留,那么从而让i-1影响我决策,处理第i天也就只有这三种情况。所以思考问题有别的思路就是后决策。
其实包括前两天写的最长子递增序列,让问题先走,找到第一组递增序列,接下来我该怎么处理,如何利用第一组进行决策就能得出最优解。
这道题很简单,第一眼看到是accepted率很低,没想到最后直到成功我发现我拉低了这个概率,考虑的不够仔细,状态机里面状态还是比较多的。