Golang每日一练(leetDay0114) 矩阵中的最长递增路径、按要求补齐数组

 

目录

329. 矩阵中的最长递增路径 Longest Increasing Path In A Matrix  🌟🌟

330. 按要求补齐数组 Patching Array  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


329. 矩阵中的最长递增路径 Longest Increasing Path In A Matrix

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。

示例 1:

输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4 
解释:最长递增路径为 [1, 2, 6, 9]。

示例 2:

输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出:4 
解释:最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。

示例 3:

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

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 200
  • 0 <= matrix[i][j] <= 2^31 - 1

代码1:DFS

package mainimport "fmt"func longestIncreasingPath(matrix [][]int) int {if len(matrix) == 0 || len(matrix[0]) == 0 {return 0}m, n := len(matrix), len(matrix[0])cache := make([][]int, m)for i := range cache {cache[i] = make([]int, n)}var dfs func(i, j int) intdfs = func(i, j int) int {if cache[i][j] != 0 {return cache[i][j]}dir := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}maxLen := 1for _, d := range dir {x, y := i+d[0], j+d[1]if x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] > matrix[i][j] {length := 1 + dfs(x, y)if length > maxLen {maxLen = length}}}cache[i][j] = maxLenreturn maxLen}result := 0for i := 0; i < m; i++ {for j := 0; j < n; j++ {length := dfs(i, j)if length > result {result = length}}}return result
}func main() {matrix := [][]int{{9, 9, 4}, {6, 6, 8}, {2, 1, 1}}fmt.Println(longestIncreasingPath(matrix))matrix = [][]int{{3, 4, 5}, {3, 2, 6}, {2, 2, 1}}fmt.Println(longestIncreasingPath(matrix))matrix = [][]int{{1}}fmt.Println(longestIncreasingPath(matrix))
}

代码2:队列+拓扑排序

package mainimport "fmt"func longestIncreasingPath(matrix [][]int) int {if len(matrix) == 0 || len(matrix[0]) == 0 {return 0}m, n := len(matrix), len(matrix[0])inDegrees := make([][]int, m)for i := range inDegrees {inDegrees[i] = make([]int, n)}dir := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}queue := make([][2]int, 0)for i := 0; i < m; i++ {for j := 0; j < n; j++ {for _, d := range dir {x, y := i+d[0], j+d[1]if x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] < matrix[i][j] {inDegrees[i][j]++}}if inDegrees[i][j] == 0 {queue = append(queue, [2]int{i, j})}}}result := 0for len(queue) > 0 {result++size := len(queue)for i := 0; i < size; i++ {cur := queue[i]for _, d := range dir {x, y := cur[0]+d[0], cur[1]+d[1]if x >= 0 && x < m && y >= 0 && y < n && matrix[x][y] > matrix[cur[0]][cur[1]] {inDegrees[x][y]--if inDegrees[x][y] == 0 {queue = append(queue, [2]int{x, y})}}}}queue = queue[size:]}return result
}func main() {matrix := [][]int{{9, 9, 4}, {6, 6, 8}, {2, 1, 1}}fmt.Println(longestIncreasingPath(matrix))matrix = [][]int{{3, 4, 5}, {3, 2, 6}, {2, 2, 1}}fmt.Println(longestIncreasingPath(matrix))matrix = [][]int{{1}}fmt.Println(longestIncreasingPath(matrix))
}

输出:

4
4
1


330. 按要求补齐数组 Patching Array

给定一个已排序的正整数数组 nums 和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。

请返回 满足上述要求的最少需要补充的数字个数 。

示例 1:

输入: nums = [1,3], n = 6
输出: 1 
解释:
根据 nums 里现有的组合 [1], [3], [1,3],可以得出 1, 3, 4。
现在如果我们将 2 添加到 nums 中, 组合变为: [1], [2], [3], [1,3], [2,3], [1,2,3]。
其和可以表示数字 1, 2, 3, 4, 5, 6,能够覆盖 [1, 6] 区间里所有的数。
所以我们最少需要添加一个数字。

示例 2:

输入: nums = [1,5,10], n = 20
输出: 2
解释: 我们需要添加 [2,4]。

示例 3:

输入: nums = [1,2,2], n = 5
输出: 0

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 10^4
  • nums 按 升序排列
  • 1 <= n <= 2^31 - 1

代码1:动态规划

package mainimport "fmt"func minPatches(nums []int, n int) int {dp := make([]bool, n+1)dp[0] = truefor _, num := range nums {for i := n; i >= num; i-- {if dp[i-num] {dp[i] = true}}}count := 0for i := 1; i <= n; i++ {if !dp[i] {count++for j := n; j >= i; j-- {if dp[j-i] {dp[j] = true}}}}return count
}func main() {nums1 := []int{1, 3}n1 := 6fmt.Println(minPatches(nums1, n1))nums2 := []int{1, 5, 10}n2 := 20fmt.Println(minPatches(nums2, n2))nums3 := []int{1, 2, 2}n3 := 5fmt.Println(minPatches(nums3, n3))
}

代码2:贪心算法 

package mainimport "fmt"func minPatches(nums []int, n int) int {count := 0      // 记录需要补充的数字个数index := 0      // 记录当前nums可表示的最大范围miss := 1       // 记录当前缺失的最小数字for miss <= n {if index < len(nums) && nums[index] <= miss {miss += nums[index] // 扩展当前范围index++} else {miss += miss // 补充缺失的数字count++}}return count
}func main() {nums1 := []int{1, 3}n1 := 6fmt.Println(minPatches(nums1, n1))nums2 := []int{1, 5, 10}n2 := 20fmt.Println(minPatches(nums2, n2))nums3 := []int{1, 2, 2}n3 := 5fmt.Println(minPatches(nums3, n3))
}

输出:

1
2
0


🌟 每日一练刷题专栏 🌟

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

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

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

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

 主页: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.hqwc.cn/news/4431.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MIT 6.830数据库系统 -- lab two

MIT 6.830数据库系统 -- lab two 项目拉取Lab Two实现提示练习一 -- Filter and Join练习二 -- Aggregates练习三 -- HeapFile Mutability练习四 -- Insertion & deletion练习五 -- Page eviction练习六 -- Query walkthrough练习七 - 查询解析 项目拉取 原项目使用ant进行…

【PostgreSQL 数据库技术峰会(成都站)】云原生虚拟数仓 PieCloudDB Database 的架构和关键模块实现...

2023年6月17日&#xff0c;中国开源软件推进联盟 PostgreSQL 分会在成都举办了数据库技术峰会。此次峰会以“新机遇、新态势、新发展”为主题&#xff0c;结合当下信创热潮、人工智能等产业变革背景&#xff0c;探讨 PostgreSQL 数据库在这些新机遇下的发展前景。峰会邀请众多行…

NoSQL之Redis配置

NoSQL 一、关系型数据库与非关系型数据库关系型数据库非关系型数据库区别 二、Redis简介Redis的优点Redis的使用场景 三、Redis安装部署四、Redis命令工具redis-cli 命令行工具redis-benchmark 测试工具 五、Redis 数据库常用命令六、Redis多数据库常用命令 一、关系型数据库与…

IDEA远程Debug调试工具(Remote)的使用

我们在开发的过程中&#xff0c;经常会遇到这样的情况&#xff1a;代码在本地测试得好好的&#xff0c;但部署上线后测试结果就不一样了&#xff0c;这时就需要去服务器上查看日志进行分析从而定位问题&#xff0c;但这样还是会比较麻烦&#xff0c;如果能够Debug调试&#xff…

【若依项目学习】day1-启动项目

若依开源框架&#xff0c;前后端分离项目&#xff0c;地址&#xff1a;http://doc.ruoyi.vip/ruoyi-vue/ 先配置环境 JDK1.8&#xff0c; MySQL5.7 &#xff0c;Maven3.6&#xff0c;redis、nginx(可以不配)、 node 具体见&#xff1a;https://ygstriver.blog.csdn.net/articl…

初级应急响应-Windows-常用工具

应急工具-PChunter PCHunter是一款强大的内核级监控软件&#xff0c;软件可以查看内核文件、驱动模块、隐藏进程、注册表内核&#xff0c;网络等等信息&#xff0c;和PCHunter功能相似的还有火绒剑&#xff0c;PowerTool等。 应急工具-Autoruns 登录时的加载程序、驱动程序加…

从渲染流程、数据处理结构聊聊Flutter性能优化

不可否认 Flutter 是一个非常强大的移动应用开发框架&#xff0c;我们在技术架构选型时就是选用的 Flutter&#xff0c;特别是跨端能力属实很优秀&#xff0c;but 也逐渐发现在复杂的应用程序实现中&#xff0c;App 的性能会受到一些影响。 其实这个问题&#xff0c;我们内部也…

九、会话控制——cookie、session、token

文章目录 前言一、cookie1.1 cookie 是什么1.2 cookie 的特点1.3 cookie 的运行流程1.4 express 框架中设置cookie1.5 express 框架中删除cookie1.6 express 框架中获取cookie 二、session2.1 session 是什么2.2 session 的作用2.3 session 的运行流程2.4 session 和 cookie 的…

Linux进程信号【信号产生】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、进程信号基本概念1.1、什么是信号&#xff1f;1.2、信号的作用1.3、信号的…

Spring Boot 中的 @Cacheable 注解

Spring Boot 中的 Cacheable 注解 在 Spring Boot 中&#xff0c;缓存是一个非常重要的话题。当我们需要频繁读取一些数据时&#xff0c;为了提高性能&#xff0c;可以将这些数据缓存起来&#xff0c;避免每次都从数据库中读取。为了实现缓存&#xff0c;Spring Boot 提供了一…

线性代数高级--二次型--特征值与特征向量--特征值分解--多元函数的泰勒展开

目录 二次型 概念 示例 性质和特点 特征值与特征向量 概念 示例 注意 性质和特点 特征值分解 注意 多元函数的泰勒展开 回顾一元函数泰勒展开 多元函数的泰勒展开 二次型 概念 二次型是一个关于向量的二次多项式&#xff0c;通常用矩阵表示。 考虑一个n维向量…

有哪些免费好用的Python IDE(集成开发环境)?

工欲善其事&#xff0c;必先利其器。Python的学习过程少不了集成开发编辑环境(IDE)。这些Python IDE会提供插件、工具等帮助开发者加快使用Python开发的速度&#xff0c;提高效率。这里收集了一些对开发者非常有帮助的Python IDE(来自hittp://doc.okbase.net/havoc/archive/242…