zoukankan      html  css  js  c++  java
  • leetcode【dynamic】【0】

    95. Unique Binary Search Trees II


     使用golang进行阶梯,如果[]int是nil,那么range下来是直接跳过的,所以可以返回[]int{nil},这样可以少了很多逻辑判断。

    198. House Robber , 120. Triangle


     这两个都是比较常规的找出子项就行,动态规划中由低向上。

    264. Ugly Number II


     这道丑数,要看到每次都次寻找最小的,新生成的可判断的数字,是由已生成的数字乘上235得到的,所以维护三个索引就可以,可以定位每一个应该寻找的最小的数。

    279. Perfect Squares


     这道一开始想法动态规划从上往下,其实是错的,目前做过的都是从下往上,不要以为做的都是无用功,其实这种解法才是比较合适的。还少了记录相关的值。


     两种方法

    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开始的索引。

    334. Increasing Triplet Subsequence


    同上类似

    303. Range Sum Query - Immutable


    解法比较简单,就是存储所有【0,i】的和

    304. Range Sum Query 2D - Immutable


    在初始化阶段和计算阶段都可以使用动态原理,再优化方案可以减少ifelse的判断次数。

    309. Best Time to Buy and Sell Stock with Cooldown 


     

    个人想法还是传统解法,从底开始,【i,end】表示从i开始到结束时的最大利润,i-1天计算,如果选择buy,那么遍历后面所有卖的情况加上卖的那天往后推两天的利润,如果不选择buy,那么就是i开始到结束的利润。所以从后往前算起。这样时间复杂度是n^2

    最优解是时间复杂度为n,空间复杂度为1 。

    前继状态其实可以有多种,这道题我们看到每天决策的时候根据前一天有关,前一天共有三种情况分别是买,卖,保留,那么下一天可根据这三种情况作出决策。

    最优解和我的想法影响因素在于,我总是先决策,然后根据我的决策再去寻找往后的适应我决策应该有的需求。比如这道题正向决策,如果我选择买,那我就需要过两天后的dp最优利润。如果我选择保留,我需要过一天的dp最优利润。 我卖的决策取决于我先买然后遍历所有可能卖的情况。

    那么最优解呢,先让它自动决策,比如我在处理第i天,那么i-1天有什么情况,可能是买卖保留,那么从而让i-1影响我决策,处理第i天也就只有这三种情况。所以思考问题有别的思路就是后决策。

    其实包括前两天写的最长子递增序列,让问题先走,找到第一组递增序列,接下来我该怎么处理,如何利用第一组进行决策就能得出最优解。

    91. Decode Ways


    这道题很简单,第一眼看到是accepted率很低,没想到最后直到成功我发现我拉低了这个概率,考虑的不够仔细,状态机里面状态还是比较多的。

     

  • 相关阅读:
    POJ 2388(排序)
    优先队列(堆实现)
    POJ 3322(广搜)
    POJ 1190(深搜)
    POJ 1456(贪心)
    poj 2524 (并查集)
    poj 1611(并查集)
    poj 1521
    poj 1220(短除法)
    css 如何实现图片等比例缩放
  • 原文地址:https://www.cnblogs.com/GrimReaper/p/9256682.html
Copyright © 2011-2022 走看看