golang LeetCode 热题 100(动态规划)-更新中

news2024/12/25 22:51:57

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1+ 12. 2 阶
示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1+ 1+ 12. 1+ 23. 2+ 1 阶
 

提示:

1 <= n <= 45

dp

func climbStairs(n int) int {
    if n==0{
        return 0
    }
    if n==1||n==2{
        return n
    }
    dp:=make([]int,n+1,n+1)
    dp[1]=1
    dp[2]=2
    for i:=3;i<=n;i++{
        dp[i]=dp[i-1]+dp[i-2]
    }
    return dp[n]
}

杨辉三角形

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。在这里插入图片描述

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:

输入: numRows = 1
输出: [[1]]
 

提示:

1 <= numRows <= 30
func generate(numRows int) [][]int {
    result:=[][]int{}
    for i:=0;i<numRows;i++{
        result=append(result,[]int{})
        for j:=0;j<=i;j++{
            if j==0{
                result[i]=append(result[i],1)
            }else if i==j{
                result[i]=append(result[i],1)
            }else{
                result[i]=append(result[i],result[i-1][j]+result[i-1][j-1])
            }
        }
    }
    return result
}

打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。
 

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 400
func rob(nums []int) int {
    if len(nums)==0{
        return 0
    }
    if len(nums)==1{
        return nums[0]
    }
    dp:=make([]int,len(nums),len(nums))
    dp[0]=nums[0]
    dp[1]=max(nums[1],nums[0])
    for i:=2;i<len(nums);i++{
        dp[i]=max(dp[i-2]+nums[i],dp[i-1])
    }
    return dp[len(nums)-1]
}
func max(i,j int)int{
    if i>j{
        return i
    }else{
        return j
    }
}

完全平方数

给你一个整数 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
func numSquares(n int) int {
    dp:=make([]int,n+1,n+1)
    nums:=[]int{}
    for i:=0;i<n+1;i++{
        dp[i]=math.MaxInt32
    }
    for i:=1;i*i<=n;i++{
        dp[i*i]=1
        nums=append(nums,i*i)
    }
    for i:=1;i<=n;i++{
        if dp[i]==math.MaxInt32{
            for _,value:=range nums{
                if i-value>0{
                    dp[i]=min(dp[i],dp[i-value]+1)
                }
            }
        }
    }
    return dp[n]
}

零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1
示例 2:

输入:coins = [2], amount = 3
输出:-1
示例 3:

输入:coins = [1], amount = 0
输出:0
 

提示:

1 <= coins.length <= 12
1 <= coins[i] <= 2^31 - 1
0 <= amount <= 10^4
func wordBreak(s string, wordDict []string) bool {
    mp:=make(map[string]bool)
    for _,w:=range wordDict{
        mp[w]=true
    }
    dp:=make([]bool,len(s)+1)
    dp[0]=true
    for i:=0;i<=len(s);i++{
        for j:=0;j<i;j++{
            if dp[j]&&mp[s[j:i]]{
                dp[i]=true
                break
            }
        }
    }
    return dp[len(s)]
}

最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的
子序列

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1
 

提示:

1 <= nums.length <= 2500
-104 <= nums[i] <= 10^4
func lengthOfLIS(nums []int) int {
    ans:=1
    dp:=make([]int,len(nums)+1,len(nums)+1)
    for i:=0;i<len(nums);i++{
        dp[i]=1
    }
    for i:=1;i<len(nums);i++{
        for j:=0;j<i;j++{
            if nums[i]>nums[j]{
                dp[i]=max(dp[i],dp[j]+1)
                if dp[i]>ans{
                    ans=dp[i]
                }
            }
        }
    }
    return ans
}

乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续
子数组
(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
 

提示:

1 <= nums.length <= 2 * 104
-10 <= nums[i] <= 10
nums 的任何子数组的乘积都 保证 是一个 32-位 整数

暴力172/190

func maxProduct(nums []int) int {
    ans:=math.MinInt32
    for i:=0;i<len(nums);i++{
        for j:=i+1;j<len(nums);j++{
            tmp:=1
            for k:=i;k<=j;k++{
                tmp*=nums[k]
                if tmp>ans{
                    ans=tmp
                }
            }
        }
    }
    return ans
}

官方题解

有点难懂,根据官方题解整一个带数组的

func maxProduct(nums []int) int {
    maxF,minF,ans:=nums[0],nums[0],nums[0]
    for i:=1;i<len(nums);i++{
        mx,mn:=maxF,minF
        maxF=max(mx*nums[i],max(nums[i],mn*nums[i]))
        minF=min(mn*nums[i],min(nums[i],mx*nums[i]))
        if minF<(-1<<31){
            minF=nums[i]
        }
        ans=max(maxF,ans)
    }
    return ans
}

dp数组

这样就容易看懂了,两个数组,一个存储以当前位置结尾的最大值,一个存储以当前位置结尾的最小值,两个数组主要是考虑到负负得正,最大的乘积有三种情况:当前数是正数上一个数的的dp也是正数,当前数是负数上一个数的dp也是负数,当前值最大。

func maxProduct(nums []int) int {
    maxF:=make([]int,len(nums),len(nums))
    minF:=make([]int,len(nums),len(nums))
    for i:=0;i<len(nums);i++{
        maxF[i]=nums[i]
        minF[i]=nums[i]
    }
    for i:=1;i<len(nums);i++{
        maxF[i]=max(maxF[i-1]*nums[i],max(nums[i],minF[i-1]*nums[i]))
        minF[i]=min(minF[i-1]*nums[i],min(nums[i],maxF[i-1]*nums[i]))
        if minF[i]<(-1<<31){
            minF[i]=nums[i]
        }
    }
    ans:=maxF[0]
    for i:=0;i<len(nums);i++{
        ans=max(ans,maxF[i])
    }
    return ans
}

分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5][11] 。
示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。
 

提示:

1 <= nums.length <= 200
1 <= nums[i] <= 100

求和+递归37/144

func searchEqual(nums []int,start int,end int,total int)bool{
    if start>end||total<0{
        return false
    }
    if total==0{
        return true
    }
    if searchEqual(nums,start+1,end,total){
        return true
    }
    if total-nums[start]<0{
        return false
    }
    if total-nums[start]>=0&&searchEqual(nums,start+1,end,total-nums[start]){
        return true
    }
    return false
}
func canPartition(nums []int) bool {
    if nums==nil||len(nums)==0{
        return true
    }
    if len(nums)==1{
        return false
    }
    total:=0
    for i:=0;i<len(nums);i++{
        total+=nums[i]
    }
    if total%2!=0{
        return false
    }
    return searchEqual(nums,0,len(nums)-1,total/2)
}

二维dp

func canPartition(nums []int) bool {
    n:=len(nums)
    if n<2{
        return false
    }
    sum,max:=0,0
    for _,v:=range nums{
        sum+=v
        if v>max{
            max=v
        }
    }
    if sum%2!=0{
        return false
    }
    target:=sum/2
    if max>target{
        return false
    }
    dp:=make([][]bool,n)
    for i:=range dp{
        dp[i]=make([]bool,target+1)
    }
    for i:=0;i<n;i++{
        dp[i][0]=true
    }
    dp[0][nums[0]]=true
    for i:=1;i<n;i++{
        v:=nums[i]
        for j:=1;j<=target;j++{
            if j>=v{
                dp[i][j]=dp[i-1][j]||dp[i-1][j-v]
            }else{
                dp[i][j]=dp[i-1][j]
            }
        }
    }
    return dp[n-1][target]
}

优化一些我的暴力

func searchEqual(nums []int,start int,end int,total int)bool{
    if start>end||total<0{
        return false
    }
    if total==0{
        return true
    }
    if searchEqual(nums,start+1,end,total){
        return true
    }
    if total-nums[start]<0{
        return false
    }
    if total-nums[start]>=0&&searchEqual(nums,start+1,end,total-nums[start]){
        return true
    }
    return false
}
func canPartition(nums []int) bool {
    if nums==nil||len(nums)==0{
        return true
    }
    if len(nums)==1{
        return false
    }
    total:=0
    max:=0
    for i:=0;i<len(nums);i++{
        total+=nums[i]
        if nums[i]<max{
            max=nums[i]
        }
    }
    if total%2!=0{
        return false
    }
    if max>total/2{
        return false
    }
    if max==total/2{
        return true
    }
    return searchEqual(nums,0,len(nums)-1,total/2)
}

还是没过

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

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

相关文章

分布式专题(10)之ShardingSphere分库分表实战指南

一、ShardingSphere产品介绍 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。Apache ShardingSphere 设计哲学为 Database Plus&#xff0c;旨在…

Vue 3.5 编写 ref 时,自动插入.Value

如果是 Vue 3.2 &#xff0c;那么可能用的是Volar

深度学习中的并行策略概述:2 Data Parallelism

深度学习中的并行策略概述&#xff1a;2 Data Parallelism 数据并行&#xff08;Data Parallelism&#xff09;的核心在于将模型的数据处理过程并行化。具体来说&#xff0c;面对大规模数据批次时&#xff0c;将其拆分为较小的子批次&#xff0c;并在多个计算设备上同时进行处…

OneCode:开启高效编程新时代——企业定制出码手册

一、概述 OneCode 的 DSM&#xff08;领域特定建模&#xff09;出码模块是一个强大的工具&#xff0c;它支持多种建模方式&#xff0c;并具有强大的模型转换与集成能力&#xff0c;能够提升开发效率和代码质量&#xff0c;同时方便团队协作与知识传承&#xff0c;还具备方便的仿…

《Web 应用项目开发:从构思到上线的全过程》

目录 一、引言 二、项目启动与需求分析 三、设计阶段 四、技术选型 五、开发阶段 六、测试阶段 七、部署与上线 八、维护与更新 九、总结 一、引言 在数字化浪潮席卷全球的当下&#xff0c;Web 应用如繁星般在互联网的苍穹中闪烁&#xff0c;它们形态各异&#xff0c…

中小学教室多媒体电脑安全登录解决方案

中小学教室多媒体电脑面临学生随意登录的问题&#xff0c;主要涉及到设备使用、网络安全、教学秩序等多个方面。以下是对这一问题的详细分析&#xff1a; 一、设备使用问题 1. 设备损坏风险 学生随意登录可能导致多媒体电脑设备过度使用&#xff0c;增加设备损坏的风险。不当…

Odoo 免费开源 ERP:通过 JavaScript 创建对话框窗口的技术实践分享

作者 | 老杨 出品 | 上海开源智造软件有限公司&#xff08;OSCG&#xff09; 概述 在本文中&#xff0c;我们将深入研讨如何于 Odoo 18 中构建 JavaScript&#xff08;JS&#xff09;对话框或弹出窗口。对话框乃是展现重要讯息、确认用户操作以及警示用户留意警告或错误的行…

OOP面向对象编程:类与类之间的关系

OOP面向对象编程&#xff1a;类与类之间的关系 三大关系&#xff1a;复合&#xff08;适配器设计模式&#xff09;、委托&#xff08;桥接设计模式&#xff09;、继承 8、1复合Composition has-a -> 适配器模式 一个类里面含有另一个类的对象 —> 复合关系 has-a 适配器设…

集成 jacoco 插件,查看单元测试覆盖率

文章目录 前言集成 jacoco 插件&#xff0c;查看单元测试覆盖率1. 添加pom2. 配置完成、执行扫描3. 执行结果4. 单元测试报告 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞…

下载运行Vue开源项目vue-pure-admin

git地址&#xff1a;GitHub - pure-admin/vue-pure-admin: 全面ESMVue3ViteElement-PlusTypeScript编写的一款后台管理系统&#xff08;兼容移动端&#xff09; 安装pnpm npm install -g pnpm # 国内 淘宝 镜像源 pnpm config set registry https://registry.npmmirror.com/…

创建用于预测序列的人工智能模型,设计模型架构。

上一篇&#xff1a;《创建用于预测序列的人工智能模型&#xff0c;设计数据集》 序言&#xff1a;在前一篇中&#xff0c;我们创建了用于训练人工智能模型的数据集。接下来&#xff0c;就要设计模型的架构了。其实&#xff0c;人工智能模型的开发关键并不在于代码量&#xff0…

ubuntu22.04安装PPOCRLabel

可使用的模型参考模型列表&#xff0c;ppocr版本这里PPOCR版本作为预训练模型&#xff1a; &#xff08;经常用放在这里&#xff09; 基础电脑配置&#xff1a; cunda12.4 ubuntu22.04系统 pytorch2.5.0 &#xff08;python3.10不能运行&#xff0c;python3.8我之前可以正…

Linux网络——TCP的运用

系列文章目录 文章目录 系列文章目录一、服务端实现1.1 创建套接字socket1.2 指定网络接口并bind2.3 设置监听状态listen2.4 获取新链接accept2.5 接收数据并处理&#xff08;服务&#xff09;2.6 整体代码 二、客户端实现2.1 创建套接字socket2.2 指定网络接口2.3 发起链接con…

江苏捷科云:可视化平台助力制造企业智能化管理

公司简介 江苏捷科云信息科技有限公司&#xff08;以下简称“捷科”&#xff09;是一家专注于云平台、云储存、云管理等产品领域的创新型企业&#xff0c;集研发、生产和销售于一体&#xff0c;致力于在网络技术领域打造尖端品牌。在推动制造业企业数字化转型的进程中&#xf…

消息队列(一)消息队列的工作流程

什么是消息队列 首先&#xff0c;代入一个场景&#xff0c;我现在做一个多系统的集成&#xff0c;分别有系统A、B、C、D四个系统&#xff0c;A系统因为使用产生了业务数据&#xff0c;B、C、D需要使用这些数据做相关的业务处理和运算&#xff0c;最基本的做法就是通过接口通信…

施耐德变频器ATV320系列技术优势:创新与安全并重

在工业自动化领域&#xff0c;追求高效、安全与智能已成为不可阻挡的趋势。施耐德变频器ATV320系列凭借其强大的设计标准和全球认证&#xff0c;成为能够帮助企业降低安装成本&#xff0c;提高设备性能的创新解决方案。 【全球认证&#xff0c;品质保障】ATV320 系列秉持施耐德…

WEB入门——文件上传漏洞

文件上传漏洞 一、文件上传漏洞 1.1常见的WebShell有哪些&#xff1f;1.2 一句话木马演示1.2 文件上传漏洞可以利用需满足三个条件1.3 文件上传导致的危害 二、常用工具 2.1 搭建upload-labs环境2.2 工具准备 三、文件上传绕过 3.1 客户端绕过 3.1.1 实战练习 &#xff1a;upl…

Android 蓝牙开发-传输数据

概述 传统蓝牙是通过建立REFCCOM sockect来进行通信的&#xff0c;类似于socket通信&#xff0c;一台设备需要开放服务器套接字并处于listen状态&#xff0c;而另一台设备使用服务器的MAC地址发起连接。连接建立后&#xff0c;服务器和客户端就都通过对BluetoothSocket进行读写…

红米Note 9 Pro5G刷小米官方系统

前言 刷机有2种方式&#xff1a;线刷 和 卡刷。 线刷 线刷&#xff1a;需要用电脑刷机工具&#xff0c;例如&#xff1a;XiaoMiFlash.exe&#xff0c;通过电脑和数据线对设备进行刷机。 适用场景&#xff1a; 系统损坏无法开机。恢复官方出厂固件。刷机失败导致软砖、硬砖的…

html + css 淘宝网实战

之前有小伙伴说&#xff0c;淘宝那么牛逼你会写代码&#xff0c;能帮我做一个一样的淘宝网站吗&#xff0c;好呀&#xff0c;看我接下来如何给你做一个淘宝首页。hahh,开个玩笑。。。学习而已。 在进行html css编写之前 先了解下网页的组成和网页元素的尺寸吧 1.网页的组成 …