zoukankan      html  css  js  c++  java
  • 279. 完全平方数

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

    示例 1:

    输入: n = 12
    输出: 3 
    解释: 12 = 4 + 4 + 4.

    示例 2:

    输入: n = 13
    输出: 2
    解释: 13 = 4 + 9.

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/perfect-squares


    思路:

    这题之前用BFS的方法解决过,之前也说过,在DP算法中还会遇到

    DP算法,还是要总结找归类的,如果就自己去找,去发现的话还挺困难的

     从官方偷的图,先要找到在这个数之前的平方数有哪些,基本上的规律就是

    比如图中的找4的最少个数的时候,要和dp【4 - 4】 + 1比,那么4为什么要减4

    5这个再找的时候为什么也是减去了4,那如果是9呢?

    9要减去1 或者 4 ,或者 9 当然除去一些不合法的

    ok,那规律就是,减去小于等于他的平方数

    class Solution {
    
      public int numSquares(int n) {
        //dp数组的长度为n + 1
            int dp[] = new int[n + 1];
            //将dp数组第一个元素设置为0,其余的都充以最大元素
            Arrays.fill(dp, Integer.MAX_VALUE);
            dp[0] = 0;
    
            //这里找到比n小的所有的平方数
            int maxIndex = (int) Math.sqrt(n) + 1;
            int square_nums[] = new int[maxIndex];
            for (int i = 1; i < maxIndex; ++i) {
                square_nums[i] = i * i;
            }
            
            //这里就遍历比较,后面得出来的值都建立在前面的值的基础上
            for (int i = 1; i <= n; ++i) {
                for (int s = 1; s < maxIndex; ++s) {
                    if (i < square_nums[s])
                        break;
                    dp[i] = Math.min(dp[i], dp[i - square_nums[s]] + 1);
                }
            }
            return dp[n];
      }
    }
  • 相关阅读:
    uoj110
    11.28模拟赛D题解
    AT1219 歴史の研究
    P5906 【模板】回滚莫队&不删除莫队
    P4175 [CTSC2008]网络管理
    SP32952 ADAFTBLL
    CF1479D Odd Mineral Resource
    SP10707 COT2
    P4074 [WC2013] 糖果公园
    P6134 [JSOI2015]最小表示
  • 原文地址:https://www.cnblogs.com/zzxisgod/p/13414216.html
Copyright © 2011-2022 走看看