博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
画解算法:279. 完全平方数
阅读量:2304 次
发布时间:2019-05-09

本文共 1173 字,大约阅读时间需要 3 分钟。

题目链接

https://leetcode-cn.com/problems/perfect-squares/

题目描述

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

示例 1:

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

示例 2:

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

解题方案

思路

  • 标签:动态规划

  • 首先初始化长度为n+1的数组dp,每个位置都为0

  • 如果n0,则结果为0

  • 对数组进行遍历,下标为i,每次都将当前数字先更新为最大的结果,即dp[i]=i,比如i=4,最坏结果为4=1+1+1+1即为4个数字

  • 动态转移方程为:dp[i] = MIN(dp[i], dp[i - j * j] + 1)i表示当前数字,j*j表示平方数

  • 时间复杂度:O(n*sqrt(n)),sqrt为平方根

代码

  • Java版本

class Solution {    public int numSquares(int n) {        int[] dp = new int[n + 1]; // 默认初始化值都为0        for (int i = 1; i <= n; i++) {            dp[i] = i; // 最坏的情况就是每次+1            for (int j = 1; i - j * j >= 0; j++) {                dp[i] = Math.min(dp[i], dp[i - j * j] + 1); // 动态转移方程            }        }        return dp[n];    }}
  • JavaScript版本

/** * @param {number} n * @return {number} */var numSquares = function(n) {    const dp = [...Array(n+1)].map(_=>0); // 数组长度为n+1,值均为0    for (let i = 1; i <= n; i++) {        dp[i] = i; // 最坏的情况就是每次+1        for (let j = 1; i - j * j >= 0; j++) {            dp[i] = Math.min(dp[i], dp[i - j * j] + 1); // 动态转移方程        }    }    return dp[n];};

画解

推荐阅读

1、

2、

3、

4、

5、

6、

7、

如果觉得文章不错,帮忙点个在看呗

转载地址:http://jyjib.baihongyu.com/

你可能感兴趣的文章
Java实现多线程的两种方式
查看>>
Java多线程之使用执行器(Executors)(Thinking in Java)
查看>>
JDBC之使用懒汉式单例创建JDBC工具类
查看>>
JDBC之最基本的CRUD操作
查看>>
JDBC之SQL注入,PreparedStatement和Statement
查看>>
JDBC之日期问题
查看>>
JDBC之大段文本数据的保存与读取
查看>>
Ubuntu Linux 13.10 中WPS输入法无法跟随显示问题
查看>>
Linux平台超级好用服务器远程管理工具webmin的安裝
查看>>
CentOS 5.2 下用Yum安装Apache+PHP+MySQL环境
查看>>
Linux操作系统下挂载远程Windows共享目录
查看>>
apache+php+mysql安装配置
查看>>
Ubuntu下pythn+Django+mysql配置
查看>>
Sublime text 3 安装pylinter的错误提示
查看>>
去掉Sublime Text 3烦人的更新新版本提醒
查看>>
启动vsftpd的问题---500 OOPS
查看>>
Linux下安装FTP服务器--vsftpd
查看>>
去掉excel保存文件时提示:隐私问题警告:此文档中包含宏
查看>>
ShellExecute详解
查看>>
sqlite3支持自增和缺省值列
查看>>