时尚坊服饰月儿 發表於 2025-6-23 13:10:00

hot100之动态规划上

<h3 id="爬楼梯070">爬楼梯(070)</h3>
<pre><code class="language-java">class Solution {
    int[] memo = new int;
    public int climbStairs(int n) {
      if (memo != 0) return memo;
      if (n == 0|| n ==1 ){
            return 1;
      }
      if (n == 2){
            return 2;
      }

      memo = climbStairs(n-1) + climbStairs(n-2);
      return memo;
    }
}
</code></pre>
<ul>
<li>废话</li>
</ul>
<p><s>这题真是从小做到大</s></p>
<p>感觉动态规划就好像 递归的记忆化</p>
<h3 id="杨辉三角118">杨辉三角(118)</h3>
<pre><code class="language-java">class Solution {
    public List&lt;List&lt;Integer&gt;&gt; generate(int numRows) {
      List&lt;List&lt;Integer&gt;&gt; res = new ArrayList&lt;&gt;();
      res.add(new ArrayList&lt;&gt;(Arrays.asList(1)));
      for (int i = 1; i &lt; numRows; i++){
            List&lt;Integer&gt; layer = new ArrayList&lt;&gt;();
            layer.add(1);
            for (int j = 1; j &lt; i; j++){
                layer.add(res.get(i-1).get(j-1) + res.get(i-1).get(j));
            }
            layer.add(1);
            res.add(layer);
      }
      return res;
    }
}
</code></pre>
<ul>
<li>分析</li>
</ul>
<p>可以看作给每层作dp</p>
<h3 id="打家劫舍198">打家劫舍(198)</h3>
<pre><code class="language-java">class Solution {
    public int rob(int[] nums) {
      int n = nums.length;
      int[] dp = new int[];
      for (int i = 0; i &lt; n; i++){
            dp = Math.max(dp+nums, dp);
      }
      return dp;
    }
}
</code></pre>
<p>优化空间</p>
<pre><code class="language-java">class Solution {
    public int rob(int[] nums){
      int dp_0 = 0;
      int dp = 0;
      for (int num : nums){
            int dp_new = Math.max(dp, dp_0 + num);
            dp_0 = dp;
            dp = dp_new;
      }
      return dp;
    }
}
</code></pre>
<ul>
<li>分析</li>
</ul>
<p>dp与dp作为基础态</p>
<p>因为dp要由dp和dp共同决定 dp与dp前置条件不足</p>
<p><strong>优化空间</strong></p>
<p>因为dp只由dp和dp决定, 返回结果也只需要最终值</p>
<p>通过<code>dp_0</code><code>dp</code> 保存所需前状态</p>
<ul>
<li>感悟</li>
</ul>
<p>dp保存区间能赚到的最大值</p>
<h3 id="完全平方数279">完全平方数(279)</h3>
<pre><code class="language-java">class Solution {
    public int numSquares(int n) {
      int[] dp = new int;
      dp = 0;
      for (int i = 1; i &lt;= n; i++){
            int min = Integer.MAX_VALUE;
            for (int j =1; j*j &lt;= i; j++){
                min = Math.min(min, dp);
            }
            dp = min + 1;
      }
      return dp;
    }
}
</code></pre>
<ul>
<li>分析</li>
</ul>
<p>两层循环, 内部循环作 <code>i - j * j</code> 遍历 j的平方</p>
<h3 id="零钱兑换322">零钱兑换(322)</h3>
<pre><code class="language-java">class Solution {
    public int coinChange(int[] coins, int amount) {
      Arrays.sort(coins);
      int[] dp = new int;
      dp = 0;
      for (int i = 1; i &lt;= amount; i++){
            int min = 10000;
            for (int coin : coins){
                if (i &lt; coin){
                  dp = min;
                  continue;
                }
                min = Math.min(min, dp);
            }
            dp = min+1;
      }
      return dp &gt; 10000 ? -1 : dp;
    }
}
</code></pre>
<ul>
<li>分析</li>
</ul>
<p>先对coins作sort, 修剪枝叶, 再二层循环</p>
<h3 id="单词拆分139">单词拆分(139)</h3>
<pre><code class="language-java">class Solution {
    public boolean wordBreak(String s, List&lt;String&gt; wordDict) {
      boolean[] dp = new boolean;
      dp = true;

      for (int i = 1; i &lt;= s.length(); i++){
            for (String word : wordDict){
                if (i &gt;= word.length() &amp;&amp; dp &amp;&amp; word.equals(s.substring(i- word.length(), i))){
                  dp = true;
                  break;
                }
            }
      }
      return dp;
    }
}
</code></pre><br><br>
来源:https://www.cnblogs.com/many-bucket/p/18944163
頁: [1]
查看完整版本: hot100之动态规划上