Golang每日一练(leetDay0101) 最长递增子序列I\II\个数

news2024/9/28 3:27:55

目录

300. 最长递增子序列 Longest Increasing Subsequence  🌟🌟

2407. 最长递增子序列 II Longest Increasing Subsequence ii  🌟🌟🌟

673. 最长递增子序列的个数 Number of Longest Increasing Subsequence  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


300. 最长递增子序列 Longest Increasing Subsequence

给你一个整数数组 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
  • -10^4 <= nums[i] <= 10^4

进阶:

  • 你能将算法的时间复杂度降低到 O(n log(n)) 吗?

代码1:二分查找,时间复杂度 O(n log n)

package main

import "fmt"

func lengthOfLIS(nums []int) int {
	n := len(nums)
	if n == 0 {
		return 0
	}
	d := make([]int, n+1)
	d[1] = nums[0]
	len := 1
	for i := 1; i < n; i++ {
		if nums[i] > d[len] {
			len++
			d[len] = nums[i]
		} else {
			l, r := 1, len
			pos := 0
			for l <= r {
				mid := l + (r-l)/2
				if d[mid] < nums[i] {
					pos = mid
					l = mid + 1
				} else {
					r = mid - 1
				}
			}
			d[pos+1] = nums[i]
		}
	}
	return len
}

func main() {
	nums := []int{10, 9, 2, 5, 3, 7, 101, 18}
	fmt.Println(lengthOfLIS(nums))

	nums = []int{0, 1, 0, 3, 2, 3}
	fmt.Println(lengthOfLIS(nums))

	nums = []int{7, 7, 7, 7, 7, 7, 7}
	fmt.Println(lengthOfLIS(nums))
}

输出:

4
4
1

代码2:动态规划,时间复杂度:O(n^2)

package main

import "fmt"

func lengthOfLIS(nums []int) int {
    n := len(nums)
    dp := make([]int, n)
    // 初始化 dp 数组
    for i := 0; i < n; i++ {
        dp[i] = 1
    }
    ans := 1
    // 开始 dp
    for i := 1; i < n; i++ {
        for j := 0; j < i; j++ {
            if nums[j] < nums[i] {
                dp[i] = max(dp[i], dp[j]+1)
            }
        }
        ans = max(ans, dp[i])
    }
    return ans
}

func max(x, y int) int {
    if x > y {
        return x
    }
    return y
}

func main() {
	nums := []int{10, 9, 2, 5, 3, 7, 101, 18}
	fmt.Println(lengthOfLIS(nums))

	nums = []int{0, 1, 0, 3, 2, 3}
	fmt.Println(lengthOfLIS(nums))

	nums = []int{7, 7, 7, 7, 7, 7, 7}
	fmt.Println(lengthOfLIS(nums))
}

2407. 最长递增子序列 II Longest Increasing Subsequence ii

给你一个整数数组 nums 和一个整数 k 。

找到 nums 中满足以下要求的最长子序列:

  • 子序列 严格递增
  • 子序列中相邻元素的差值 不超过 k 。

请你返回满足上述要求的 最长子序列 的长度。

子序列 是从一个数组中删除部分元素后,剩余元素不改变顺序得到的数组。

示例 1:

输入:nums = [4,2,1,4,3,4,5,8,15], k = 3
输出:5
解释:
满足要求的最长子序列是 [1,3,4,5,8] 。
子序列长度为 5 ,所以我们返回 5 。
注意子序列 [1,3,4,5,8,15] 不满足要求,因为 15 - 8 = 7 大于 3 。

示例 2:

输入:nums = [7,4,5,1,8,12,4,7], k = 5
输出:4
解释:
满足要求的最长子序列是 [4,5,8,12] 。
子序列长度为 4 ,所以我们返回 4 。

示例 3:

输入:nums = [1,5], k = 1
输出:1
解释:
满足要求的最长子序列是 [1] 。
子序列长度为 1 ,所以我们返回 1 。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i], k <= 10^5

代码:二分查找

package main

import "fmt"

var mx []int // 全局变量

func updateTree(root, l, r, i, val int) {
	if l == r {
		mx[root] = val
		return
	}
	mid := (l + r) / 2
	if i <= mid {
		updateTree(root*2, l, mid, i, val)
	} else {
		updateTree(root*2+1, mid+1, r, i, val)
	}
	mx[root] = max(mx[root*2], mx[root*2+1])
}

func query(root, l, r, L, R int) int {
	if L <= l && r <= R {
		return mx[root]
	}
	ret := 0
	mid := (l + r) / 2
	if L <= mid {
		ret = query(root*2, l, mid, L, R)
	}
	if R > mid {
		ret = max(query(root*2+1, mid+1, r, L, R), ret)
	}
	return ret
}

func lengthOfLIS(nums []int, k int) int {
	up := 0
	for _, x := range nums {
		if x > up {
			up = x
		}
	}
	mx = make([]int, 4*up)
	for _, x := range nums {
		if x == 1 {
			updateTree(1, 1, up, 1, 1)
		} else {
			L := x - k
			if L < 1 {
				L = 1
			}
			ret := 1 + query(1, 1, up, L, x-1)
			updateTree(1, 1, up, x, ret)
		}
	}
	return mx[1]
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	nums1 := []int{4, 2, 1, 4, 3, 4, 5, 8, 15}
	k1 := 3
	fmt.Println(lengthOfLIS(nums1, k1))
	nums2 := []int{7, 4, 5, 1, 8, 12, 4, 7}
	k2 := 5
	fmt.Println(lengthOfLIS(nums2, k2))
	nums3 := []int{1, 5}
	k3 := 1
	fmt.Println(lengthOfLIS(nums3, k3))
}

输出:

5
4
1


673. 最长递增子序列的个数 Number of Longest Increasing Subsequence

给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。

注意 这个数列必须是 严格 递增的。

示例 1:

输入: [1,3,5,4,7]
输出: 2
解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。

示例 2:

输入: [2,2,2,2,2]
输出: 5
解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。

提示: 

  • 1 <= nums.length <= 2000
  • -10^6 <= nums[i] <= 10^6

代码:

package main

import "fmt"

func findNumberOfLIS(nums []int) int {
	n := len(nums)
	if n <= 1 {
		return n
	}
	dp := make([]int, n)
	cnt := make([]int, n)
	for i := range dp {
		dp[i], cnt[i] = 1, 1
	}
	maxLen, ans := 1, 0
	for i := 1; i < n; i++ {
		for j := 0; j < i; j++ {
			if nums[j] < nums[i] {
				if dp[j]+1 > dp[i] {
					dp[i], cnt[i] = dp[j]+1, cnt[j]
				} else if dp[j]+1 == dp[i] {
					cnt[i] += cnt[j]
				}
			}
		}
		maxLen = max(maxLen, dp[i])
	}
	for i := range cnt {
		if dp[i] == maxLen {
			ans += cnt[i]
		}
	}
	return ans
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

func main() {
	fmt.Println(findNumberOfLIS([]int{1, 3, 5, 4, 7}))
	fmt.Println(findNumberOfLIS([]int{2, 2, 2, 2, 2}))
}

输出:

2
5


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

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

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

相关文章

YOLOv5/v7 添加注意力机制,30多种模块分析⑥,S2-MLPv2模块,NAM模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、S2-MLPv2模块1、 S2-MLPv2模块的原理2、实验结果3、应用示例 三、NAM模块1、NAM 的原理2、实验结果3、应用示例 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&a…

【Duilib】资源打包入EXE

环境 VS版本&#xff1a;VS2013 概述 资源打包成ZIP&#xff0c;ZIP文件放置EXE内部。 步骤 1、按上一篇建好工程。 2、RC文件添加ZIP资源。 这一步比较复杂&#xff0c;工程 添加资源&#xff0c;弹窗如下右侧对话框后&#xff0c;按①②③④步骤&#xff0c;找到theme.z…

Springboot项目使用原生Websocket

目录 1.启用Websocket功能2.封装操作websocket session的工具3.保存websocket session的接口4.保存websocket session的类5.定义websocket 端点6.创建定时任务 ping websocket 客户端 1.启用Websocket功能 package com.xxx.robot.config;import org.springframework.context.a…

机器学习实践(1.2)XGBoost回归任务

前言 XGBoost属于Boosting集成学习模型&#xff0c;由华盛顿大学陈天齐博士提出&#xff0c;因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络&#xff0c;XGBoost能更好的处理表格数据&#xff0c;并具有更强的可解释性&#xff0c;还具有易于调参…

Axure教程—树

本文将教大家如何用AXURE中的动态面板制作树 一、效果 预览地址&#xff1a;https://1rmtjd.axshare.com 二、功能 1、点击“”&#xff0c;展开子节点 2、点击“-”子节点折叠 三、制作 1、父节点制作 拖入一个动态面板&#xff0c;进入&#xff0c;如图&#xff1a; 拖入一…

【LeetCode】HOT 100(18)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

【玩转Docker小鲸鱼叭】Docker容器常用命令大全

在 Docker 核心概念理解 一文中&#xff0c;我们知道 Docker容器 其实就是一个轻量级的沙盒&#xff0c;应用运行在不同的容器中从而实现隔离效果。容器的创建和运行是以镜像为基础的&#xff0c;容器可以被创建、销毁、启动和停止等。本文将介绍下容器的这些常用操作命令。 1、…

max^2 - min^2

2001^2- 2000^2 ???? max^2 - min^2min * (max - min) min * (max - min) (max - min)* (max - min) min * (max - min) * 2 (max - min)* (max - min) (max min)(max - min)

管理类联考——逻辑——技巧篇——形式逻辑——秒杀思路

第一章&#xff1a;说明 形式逻辑出现频次 8-10 道 形式逻辑细分思路 直言命题三段论与文氏图AEIO 与模态命题形式逻辑复合命题固定秒杀思路 说明1&#xff1a; AEIO 全称肯定命题&#xff1a;所有 S 都是 P&#xff0c;记作 SAP。 简称为“A” 全称否定命题&#xff1a;所…

TCL、海信、小米密集推新,Mini LED电视熬出头了

作者 | 辰纹 来源 | 洞见新研社 OLED和Mini LED之间的对决来到了赛点。 进入2023年&#xff0c;一线电视厂商发布的新品中&#xff0c;Mini LED成为主流。 3月2日&#xff0c;索尼全球发布了其2023年BRAVIA XR 电视新品阵容。其中&#xff0c;索尼Mini LED电视X95L采用Mini …

MFC学习之修改设置控件字体显示和颜色参数

前言 最近一直配合研发部门写一些调试类的小软件&#xff0c;记得之前电脑显示器和显卡配置都不高&#xff0c;显示分辨率比较低&#xff0c;软件界面上的文字还能看到清楚&#xff08;不显小&#xff09;。 现在公司新配置的电脑都比较好了&#xff0c;界面字体&#xff0c;尤…

【高性能计算】监督学习之支持向量机分类实验

【高性能计算】监督学习之支持向量机分类实验 实验目的实验内容实验步骤1、支持向量机算法1.1 支持向量机算法的基本思想1.2 支持向量机算法的分类过程1.3 支持向量机算法的模型构建过程 2、使用Python语言编写支持向量机的源程序代码并分析其分类原理2.1 支持向量机SVM模型代码…

四、卷积神经网络整体基础结构

一、计算机发展应用 神经网络主要用于特征提取 卷积神经网络主要应用在图像领域&#xff0c;解决传统神经网络出现的过拟合、权重太多等风险 1&#xff0c;CV领域的发展 Computer vision计算机视觉的发展在2012年出现的AlexNet开始之后得到了挽救 之前都是一些传统的机器学习…

SQL高级语句2

SQL高级语句2 SQL高级语句17.---- 连接查询 ----18.自我连接&#xff0c;算排名&#xff1a;19.---- CREATE VIEW ----视图&#xff0c;可以被当作是虚拟表或存储查询。20.---- UNION ----联集&#xff0c;将两个SQL语句的结果合并起来&#xff0c;两个SQL语句所产生的字段需要…

重新定义DevOps:容器化的变革力量

在快速发展的数字时代&#xff0c;DevOps 已成为重塑软件开发格局的重要范例。DevOps 是一个源自“开发”和“运营”的术语&#xff0c;它将这两个历史上孤立的功能集成到一个统一的方法中&#xff0c;专注于缩短软件开发生命周期。因此&#xff0c;DevOps 实践促进了更快、更可…

【产品应用】一体化电机在拉伸吹瓶机的应用

随着塑料瓶的广泛应用&#xff0c;拉伸吹瓶机作为生产塑料瓶的关键设备之一&#xff0c;受到了越来越多企业的关注。而在拉伸吹瓶机中&#xff0c;一体化电机的应用正逐渐成为行业的新趋势。 01.设备简介 吹瓶机是一种用于制造塑料瓶的机械设备。它通过将预先加热的塑料颗粒或…

当 MQTT 遇上 ChatGPT:探索可自然交互的物联网智能应用

前言 随着物联网技术的迅猛发展&#xff0c;人与设备、设备与设备之间的互动已变得不再困难&#xff0c;而如何更加自然、高效、智能地实现交互则成为物联网领域新的挑战。 近期&#xff0c;由 OpenAI 发布的 ChatGPT、GPT-3.5 和 GPT-4 等先进大语言模型&#xff08;LLM&…

python 基础知识:使用jieba库对文本进行分词

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、jieba库是什么&#xff1f; Python的jieba库是一个中文分词工具&#xff0c;它可以将一段中文文本分割成一个一个的词语&#xff0c;方便后续的自然语言处理任务&#xff0c;如文本分类、情感分析等。 jieba库使用…

Riddztecia 作品集 |Beast Wear 出品

Beast & Wear&#xff1a;一个以彩色部落和可训练野兽庆祝多样性的收藏品。通过 NFT 野兽和装备提升你的 Riddzee 人物化身&#xff0c;增强视觉效果&#xff0c;提升你在迷人的 Riddztecia 世界中的游戏体验。去游戏、去成长、去探索。 Riddztecia NFT 空投包括训练怪兽和…

leetcode216. 组合总和 III(回溯算法-java)

组合总和 III leetcode216. 组合总和 III题目描述解题思路代码演示 回溯算法专题 leetcode216. 组合总和 III 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/combination-sum-iii 题目描述 找出所有相加之和为 n 的 k 个…