【LeetCode: 279. 完全平方数 | 暴力递归=>记忆化搜索=>动态规划 | 背包模型】

news2024/11/24 16:01:45

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力法
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 279. 完全平方数

⛲ 题目描述

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

输入:n = 12
输出:3
解释:12 = 4 + 4 + 4
示例 2:

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

提示:

1 <= n <= 104

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路

  1. 我们先来读一下题目的意思,题目让我们求的是和为 n 的完全平方数的最少数量是多少,那么我们怎么做呢?我们是不是可以先把所有小于n的所有完全平方数都存起来,然后从我们的容器中选择满足要求的完全平方数,并记录个数,最后返回满足题目要求最少的个数即可。
  2. 如果之前对背包模型有印象的同学就可以很容易的看出来这是一个完全背包问题,稍微转换一下就可以做。
  3. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码

注意:这个递归函数为了大家更好理解,还有一个更好的递归函数就是省略我们的index位置,因为index状态是不影响我们最终的结果的,可以省略,此处大家需要注意,感兴趣的同学可以自行实现。

class Solution {
    public int numSquares(int n) {
        int m=(int)(Math.sqrt(n));
        int[] arr=new int[m];
        for(int i=1;i<=m;i++){
            arr[i-1]=i*i;
        }
        return process(0,n,arr);
    }

    public int process(int index,int sum,int[] arr){
        if(sum==0) return 0;
        if(index>=arr.length||sum<0){
            return Integer.MAX_VALUE;
        }
        int min=Integer.MAX_VALUE;
        for(int i=index;i<arr.length;i++){
            int temp=process(i,sum-arr[i],arr);
            if(temp!=Integer.MAX_VALUE){
                min=Math.min(min,process(i,sum-arr[i],arr)+1);
            }
        }
        return min;
    }
}

🥦 运行结果

时间超限了,不要紧张,我们来继续优化它!
在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。

🥦 实现代码

class Solution {
    int[][] dp;
    public int numSquares(int n) {
        int m=(int)(Math.sqrt(n));
        int[] arr=new int[m];
        dp=new int[m+1][n+1];
        for(int i=0;i<dp.length;i++) Arrays.fill(dp[i],-1);
        for(int i=1;i<=m;i++){
            arr[i-1]=i*i;
        }
        return process(0,n,arr);
    }

    public int process(int index,int sum,int[] arr){
        if(sum==0) return 0;
        if(index>=arr.length||sum<0){
            return Integer.MAX_VALUE;
        }
        if(dp[index][sum]!=-1) return dp[index][sum];
        int min=Integer.MAX_VALUE;
        for(int i=index;i<arr.length;i++){
            int temp=process(i,sum-arr[i],arr);
            if(temp!=Integer.MAX_VALUE){
                min=Math.min(min,process(i,sum-arr[i],arr)+1);
            }
        }
        return dp[index][sum]=min;
    }
}

🥦 运行结果

依旧没有通过,此时我们有俩种选择,第一种是继续向下做,将记忆化搜索改为动态规划,第二种是修改我们的递归函数,递归函数的状态有设置的不好,可以继续修改。
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。

🥦 实现代码

class Solution {
    int[] dp;
    public int numSquares(int n) {
        int m=(int)(Math.sqrt(n));
        int[] arr=new int[m];
        dp=new int[n+1];
        Arrays.fill(dp,Integer.MAX_VALUE);
        dp[0]=0;
        for(int i=1;i<=m;i++){
            arr[i-1]=i*i;
        }
        for(int i=0;i<arr.length;i++){
            for(int target=0;target<=n;target++){
                if(target>=arr[i]){
                    dp[target]=Math.min(dp[target-arr[i]]+1,dp[target]);
                }
            }
        }
        return dp[n];
    }
}

🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Goby 漏洞更新 |商混ERP系统 DictionaryEdit.aspx 页面存在SQL注入

漏洞名称&#xff1a;商混ERP系统 DictionaryEdit.aspx 页面存在SQL注入 English Name&#xff1a;SQL injection exists on Lotus ERP DictionaryEdit.aspx pag CVSS core: 8.5 影响资产数&#xff1a;616 漏洞描述&#xff1a; 杭州荷花软件有限公司开发的商混ERP系统。…

开发板和虚拟机socket报错“connect error: No route to host”

学习socket编程时&#xff0c;将服务器程序运行在开发板上&#xff0c;将客户端应用程序运行在 虚拟机Ubuntu16.04 系统&#xff0c;服务器可以正常开启&#xff0c; 但客户端连接时&#xff0c; 报错“connect error: No route to host” 1、网上大多是以下情况&#xff1a; …

易智编译EaseEditing:计算机顶会不一定比SCI期刊更权威!

计算机SCI期刊和学术会议都是评估学术研究水平和影响力的重要指标&#xff0c;但在不同领域、不同学科、不同评价指标下可能会有不同的权威性。 在计算机科学领域&#xff0c;传统上认为顶级学术会议的影响力和权威性更高。 因为计算机科学发展较快&#xff0c;研究领域广泛&a…

【Linux】8. 环境变量

1. 环境变量的引入 先描述一个现象&#xff0c;我们在执行二进制可执行程序的时候&#xff0c;是需要找到其所在位置的(程序要运行必须先加载到内存&#xff0c;是因为冯诺依曼体系结构规定CPU只能从内存中读取数据)&#xff0c;所以这也就是为什么我们在运行前带上./的原因&a…

洛谷P5717-三角形分类

洛谷P5717-三角形分类 题目 这道题更像是初中题&#xff0c;但是怎么能完整的按照题目的意思来解决呢&#xff0c;说实话这个题卡了我有一会儿&#xff0c;要做一次性做出这个题&#xff0c;我觉得需要搞清楚if-if 和if-else if-else if&#xff0c;试想这两个的区别是什么&am…

ChatGPT有意识吗?

​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ChatGPT是一个计算机程序&#xff0c;它没有意识。它只是根据预设的算法和规则来处理输入和输出。虽然它可以模拟人类的对话&#xff0c;但它没有自己的思想或感觉。它只是根据程序设…

ROS 下 激光扫描仪 YDLidar-G4 使用

环境配置&#xff1a; ubuntu20.04 LTS ROS noetic 编程工具&#xff1a;vs code&#xff0c;远程通过ssh访问 扫描仪&#xff1a;YDLidar-G4 YDLidar驱动&#xff1a; YDLidar SDK YDLidar ROS 功能包 1 . YDLidar-SDK通信协议 雷达扫描输出的数据以十六进制格式输出到通信…

Linux文本之sed流编辑器

一、sed的相关知识及其工作流程 1&#xff09;sed编辑器的介绍 sed是一种流编辑器&#xff0c;它一次处理一行内容。处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff08;pattern space&#xff09;&#xff0c;接着用sed命令处理缓…

使用HDFS底层文件进行HBase跨集群数据迁移

目录 一、概述 二、环境信息 三、HBCK2下载和编译 四、具体操作步骤 4.1 数据同步 4.2 添加元数据 4.3 重新分配region 一、概述 客户集群机房迁移&#xff0c;我们部署的集群也要完成跨集群迁移hbase 表&#xff0c;这里选择迁移Hadoop底层数据来实现hbase的表迁移。 …

Plant Simulation 模型保存历史记录

Plant Simulation 建模是一个长时间的过程&#xff0c;所以做好模型保存历史记录很重要&#xff0c;这次分享一个OOTB&#xff08;开盒即用/系统自带&#xff09;的记录保存历史记录的功能。 文中截图于 Plant Simulation 16.0.5 目录 1.功能设置与说明2.使用场景3.总结 1.功能…

Selenium自动化测试中的PageObject模式

PageObject模式简介 众所周知&#xff0c;UI页面元素常常是不稳定的&#xff0c;在使用Selenium编写WebUI自动化测试用例时&#xff0c;随着测试脚本的增加&#xff0c;维护和更新这些元素便成为一个令人头疼的问题。 在普通模式下&#xff0c;脚本直接定位并操作元素&#xf…

链表中的经典问题

一、反转链表 反转一个单链表:一种解决方案是按原始顺序迭代结点&#xff0c;并将它们逐个移动到列表的头部。 方法1:迭代 C struct ListNode* reverseList(struct ListNode* head) {struct ListNode* prev NULL;struct ListNode* curr head;while (curr) {struct ListN…

字节跳动软件测试面试记:二面被按地上血虐,所幸Offer已到手

在互联网做了几年之后&#xff0c;去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好&#xff0c;更重要的是&#xff0c;它是对你专业能力的背书&#xff0c;大厂工作背景多少会给你的简历增加几分竞争力。 但说实话&#xff0c;想进大厂还真没那么容易。最近面试字…

Linux中与“系统网络状态”相关的内核数据结构

六、系统网络状态相关的数据结构 6.1 ifconf \linux-2.6.32.63\include\linux\if.h /* Structure used in SIOCGIFCONF request. Used to retrieve interfaceconfiguration for machine (useful for programs which must know allnetworks accessible). */ struct ifcon…

腾讯云与中电金信发布联合核心方案

5月11日&#xff0c;以“聚力革新&#xff0c;行稳致远”为主题的 “腾讯金融云国产化战略峰会”在北京举办&#xff0c;来自金融业、科技侧、研究机构的专家学者同聚一堂&#xff0c;共同探讨银行核心下移方法论以及国产化转型实践等话题。会议期间&#xff0c;中电金信副总经…

Java面试(2)数据类型

数据类型 1. Java有哪些数据类型 Java基本数据类型 这八种基本类型都有对应的包装类分别为&#xff1a;Byte、Short、Integer、Long、Float、Double、Character、Boolean 。 引用数据类型 引用数据类型非常多&#xff0c;大致包括&#xff1a;类、 接口类型、 数组类型、 枚…

AI低代码平台遍地开花,AI对于低代码到底是帮手还是对手?

AI对于低代码平台到底是帮手还是对手&#xff1f; 近日&#xff0c;CSDN举办的新程序员大会中&#xff0c;对于AI在代码领域的能力进行了5个层级的定义。并且进行了大量的测试&#xff0c;发现当下的AI已经可以去到初级程序员了&#xff0c;而更为强大的GPT-4的代码能力甚至还有…

Goby 漏洞更新 | 铭飞 CMS list 接口 sqlWhere 参数 sql 注入漏洞

漏洞名称&#xff1a;铭飞 CMS list 接口 sqlWhere 参数 sql 注入漏洞 English Name&#xff1a;MCMS list Interface sqlWhere Sql Injection Vulnerability CVSS core: 7.5 影响资产数&#xff1a;3091 漏洞描述&#xff1a; MCMS 是一套基于 java 开发的轻量级开源内容…

【时空权衡】

目录 知识框架No.0 时空权衡一、基本思想 No.1 计数排序二、分布计数 No.2 散列法 知识框架 No.0 时空权衡 一、基本思想 其实时空权衡&#xff1a;是指在算法的设计中&#xff0c;对算法的时间和空间作出权衡。 本文主要是是用空间来换时间的。(应该是这样吧) 对问题的部分或…

同样是做大模型的科技公司,为啥差距这么大呢?

2022年OpenAI亏了30多亿元&#xff0c; 站在风口上&#xff0c;谁的压力会小呢&#xff1f; 【科技明说 &#xff5c; 每日看点】站在风口上。OpenAI公司在2022年亏得十分“灿烂”&#xff0c;和往年同比几乎翻了一倍&#xff0c;亏损约达5.4亿美元&#xff0c;折合人民币约31…