golang刷leetcode技巧之如何实现最长上升子序列
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,小编给大家分享一下golang刷leetcode技巧之如何实现最长上升子序列,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:
千家信息网最后更新 2025年02月08日golang刷leetcode技巧之如何实现最长上升子序列
小编给大家分享一下golang刷leetcode技巧之如何实现最长上升子序列,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:
可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
解题思路:
解法1:动态规划
1,用dp[i]标识,i 位置的最大长度
2,状态转移方程为 dp[i]=max(dp[j]+1) ,j>=0 j
3,取dp最大值
解法2:二分查找
1,用数组记录最长递增序列
2,如果当前元素比最大值大,则插在后面
2,通过二分查找在递增序列里查找位置
3,注意和普通二分查找的区别,如果但强位置比序列位置p的元素大,那么插入位置不是p而是p+1
4,输出p的长度
代码实现
func lengthOfLIS(nums []int) int { if len(nums)<1{ return 0 } dp:=make([]int,len(nums)) for i:=0;imax{ max=dp[i] } } fmt.Println(dp) return max}
func lengthOfLIS(nums []int) int { if len(nums)<1{ return 0 } var dp []int dp=append(dp,nums[0]) for i:=1;idp[len(dp)-1]{ dp=append(dp,nums[i]) }else{ l:=0 r:=len(dp)-1 p:=0 for l<=r{ mid:=(l+r)>>1 if nums[i]>dp[mid]{ p=mid+1 l=mid+1 }else{ r=mid-1 } } fmt.Println(dp,l,r,p,i,nums[i]) dp[p]=nums[i] fmt.Println("111",dp,l,r,p,i,nums[i]) } } fmt.Println(dp) return len(dp)}
看完了这篇文章,相信你对"golang刷leetcode技巧之如何实现最长上升子序列"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!
序列
最长
升子
位置
长度
最大
输出
技巧
复杂
元素
复杂度
数组
时间
最大值
算法
篇文章
解法
普通
代码
动态
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
工业自动化软件开发语言
手机端QQ消息数据库
GaBi软件和数据库
腾风山东互联网科技有限公司
学网络技术出来好找工作吗
万物互联如何保障网络安全
亲子网络安全拍手歌
网络安全调查法
视易服务器的云储存
瀑布式软件开发模型的优点
30能不能学软件开发
教务在线内部服务器错误
为sql缓存通知启用数据库
学校知网服务器忙
做软件开发要学网络吗
dm数据库怎么修改表权限
网络安全讲座新闻稿范文
证书代表软件开发者身份
怎样将数据写入到数据库
查询数据库时间制定格式
通用服务器价钱
戒毒网络安全标准
数据库笛卡尔积代码
做软件开发能月入2万么
php服务器管理代码
服务器怎样设计网卡
基准网络技术是什么
网络安全工程师下半年报名
ajax是同步数据库么
三星手机设置代理服务器