Golang每日一练(leetDay0021) 旋转链表、不同路径、不同路径II

简介: Golang每日一练(leetDay0021) 旋转链表、不同路径、不同路径II

61. 旋转链表 Rotate List

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

输入:head = [1,2,3,4,5], k = 2

输出:[4,5,1,2,3]


示例 2:

输入:head = [0,1,2], k = 4

输出:[2,0,1]


提示:

  • 链表中节点的数目在范围 [0, 500]
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 10^9

代码:

package main
import (
  "fmt"
)
type ListNode struct {
  Val  int
  Next *ListNode
}
func rotateRight(head *ListNode, k int) *ListNode {
  if head == nil || head.Next == nil || k == 0 {
    return head
  }
  n := 1
  cur := head
  for cur.Next != nil {
    cur = cur.Next
    n++
  }
  cur.Next = head
  k = n - k%n
  for i := 0; i < k; i++ {
    cur = cur.Next
  }
  head = cur.Next
  cur.Next = nil
  return head
}
func build(nums []int) *ListNode {
  if len(nums) == 0 {
    return nil
  }
  head := &ListNode{Val: nums[0]}
  p := head
  for i := 1; i < len(nums); i++ {
    node := &ListNode{Val: nums[i]}
    p.Next = node
    p = p.Next
  }
  return head
}
func (head *ListNode) travel() {
  for p := head; p != nil; p = p.Next {
    fmt.Print(p.Val)
    if p.Next != nil {
      fmt.Print("->")
    }
  }
  fmt.Println("<nil>")
}
func main() {
  nums := []int{1, 2, 3, 4, 5}
  head := build(nums)
  head.travel()
  rotateRight(head, 2).travel()
}

输出:

1->2->3->4->5<nil>

4->5->1->2->3<nil>


62. 不同路径 Unique Paths

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7

输出:28

示例 2:

输入:m = 3, n = 2

输出:3

解释:

从左上角开始,总共有 3 条路径可以到达右下角。

1. 向右 -> 向下 -> 向下

2. 向下 -> 向下 -> 向右

3. 向下 -> 向右 -> 向下


示例 3:

输入:m = 7, n = 3

输出:28


示例 4:

输入:m = 3, n = 3

输出:6


提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109

代码:

package main
import (
  "fmt"
)
func uniquePaths(m int, n int) int {
  dp := make([][]int, m)
  for i := range dp {
    dp[i] = make([]int, n)
    dp[i][0] = 1
  }
  for j := 0; j < n; j++ {
    dp[0][j] = 1
  }
  for i := 1; i < m; i++ {
    for j := 1; j < n; j++ {
      dp[i][j] = dp[i-1][j] + dp[i][j-1]
    }
  }
  return dp[m-1][n-1]
}
func main() {
  fmt.Println(uniquePaths(3, 7))
  fmt.Println(uniquePaths(3, 2))
}

输出:

28

3


63. 不同路径 II Unique Paths

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 10 来表示。

示例 1:

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]

输出:2

解释:3x3 网格的正中间有一个障碍物。

从左上角到右下角一共有 2 条不同的路径:

1. 向右 -> 向右 -> 向下 -> 向下

2. 向下 -> 向下 -> 向右 -> 向右


示例 2:

输入:obstacleGrid = [[0,1],[0,0]]

输出:1


提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j]01

代码:

package main
import (
  "fmt"
)
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
  m, n := len(obstacleGrid), len(obstacleGrid[0])
  if obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1 {
    return 0
  }
  dp := make([][]int, m)
  for i := range dp {
    dp[i] = make([]int, n)
  }
  dp[0][0] = 1
  for i := 1; i < m; i++ {
    if obstacleGrid[i][0] == 0 {
      dp[i][0] = dp[i-1][0]
    }
  }
  for j := 1; j < n; j++ {
    if obstacleGrid[0][j] == 0 {
      dp[0][j] = dp[0][j-1]
    }
  }
  for i := 1; i < m; i++ {
    for j := 1; j < n; j++ {
      if obstacleGrid[i][j] == 0 {
        dp[i][j] = dp[i-1][j] + dp[i][j-1]
      }
    }
  }
  return dp[m-1][n-1]
}
func main() {
  obstacleGrid := [][]int{{0, 0, 0}, {0, 1, 0}, {0, 0, 0}}
  fmt.Println(uniquePathsWithObstacles(obstacleGrid))
}

输出:

2


🌟 每日一练刷题专栏 🌟

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

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

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

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

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


目录
相关文章
|
16天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
33 1
|
1月前
|
JSON 数据可视化 API
玩转数据科学:Python实战分析天气预报变动趋势
【10月更文挑战第1天】随着气候变化对日常生活的影响日益显著,理解和预测天气模式变得越来越重要。本文将引导您如何使用Python来抓取和分析天气预报数据,从而揭示天气变化的趋势。我们将介绍从获取公开气象API的数据到清洗、处理以及可视化整个过程的技术方法。
198 2
|
6月前
|
API 数据库 Python
使用Python构建一个简单的天气预报应用
使用Python构建一个简单的天气预报应用
85 1
|
5月前
|
Go
Go语言每日一练链表篇(一)
Go语言每日一练链表篇(一)
|
6月前
|
Python
python天气预报信息
python天气预报信息
|
6月前
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
93 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
6月前
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
65 0
Linux 终端命令之文件浏览(2) more
|
6月前
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
64 0
Linux 终端操作命令(2)内部命令
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
117 4
Golang语言之管道channel快速入门篇
|
2月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
67 4
Golang语言文件操作快速入门篇
下一篇
无影云桌面