Golang每日一练(leetDay0030) 合并有序数组、格雷编码、子集 II

简介: Golang每日一练(leetDay0030) 合并有序数组、格雷编码、子集 II

88. 合并两个有序数组 Merge Sorted Array

给你两个按 非递减顺序 排列的整数数组 nums1 nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并nums2 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3

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

解释:需要合并 [1,2,3] 和 [2,5,6] 。

合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。


示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0

输出:[1]

解释:需要合并 [1] 和 [] 。

合并结果是 [1] 。


示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1

输出:[1]

解释:需要合并的数组是 [] 和 [1] 。

合并结果是 [1] 。

注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。


提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -10^9 <= nums1[i], nums2[j] <= 10^9

进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?

代码1: 双指针正向遍历

package main
import (
  "fmt"
  "strings"
)
func merge(nums1 []int, m int, nums2 []int, n int) {
  // 复制nums1中的前m个元素到新数组中
  nums := make([]int, m)
  copy(nums, nums1[:m])
  // 双指针遍历nums1和nums2,将较小的元素放入nums1中
  p1, p2 := 0, 0
  for i := 0; i < m+n; i++ {
    if p1 >= m {
      nums1[i] = nums2[p2]
      p2++
    } else if p2 >= n {
      nums1[i] = nums[p1]
      p1++
    } else if nums[p1] <= nums2[p2] {
      nums1[i] = nums[p1]
      p1++
    } else {
      nums1[i] = nums2[p2]
      p2++
    }
  }
}
func main() {
  nums1 := []int{1, 2, 3, 0, 0, 0}
  nums2 := []int{2, 5, 6}
  m, n := 3, 3
  merge(nums1, m, nums2, n)
  fmt.Println(strings.Join(strings.Fields(fmt.Sprint(nums1)), ","))
}

输出:

[1,2,2,3,5,6]

代码2: 双指针逆向遍历

package main
import (
  "fmt"
  "strings"
)
func merge(nums1 []int, m int, nums2 []int, n int) {
  p1, p2 := m-1, n-1
  for i := m + n - 1; i >= 0; i-- {
    if p1 < 0 {
      nums1[i] = nums2[p2]
      p2--
    } else if p2 < 0 {
      nums1[i] = nums1[p1]
      p1--
    } else if nums1[p1] >= nums2[p2] {
      nums1[i] = nums1[p1]
      p1--
    } else {
      nums1[i] = nums2[p2]
      p2--
    }
  }
}
func main() {
  nums1 := []int{1, 2, 3, 0, 0, 0}
  nums2 := []int{2, 5, 6}
  m, n := 3, 3
  merge(nums1, m, nums2, n)
  fmt.Println(strings.Join(strings.Fields(fmt.Sprint(nums1)), ","))
}

89. 格雷编码 Gray Code

n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:

  • 每个整数都在范围 [0, 2n - 1] 内(含 02n - 1
  • 第一个整数是 0
  • 一个整数在序列中出现 不超过一次
  • 每对 相邻 整数的二进制表示 恰好一位不同 ,且
  • 第一个最后一个 整数的二进制表示 恰好一位不同

给你一个整数 n ,返回任一有效的 n 位格雷码序列

示例 1:

输入:n = 2

输出:[0,1,3,2]

解释:

[0,1,3,2] 的二进制表示是 [00,01,11,10] 。

- 00 和 01 有一位不同

- 01 和 11 有一位不同

- 11 和 10 有一位不同

- 10 和 00 有一位不同

[0,2,3,1] 也是一个有效的格雷码序列,其二进制表示是 [00,10,11,01] 。

- 00 和 10 有一位不同

- 10 和 11 有一位不同

- 11 和 01 有一位不同

- 01 和 00 有一位不同


示例 2:

输入:n = 1

输出:[0,1]


提示:

  • 1 <= n <= 16

代码:

package main
import (
  "fmt"
  "strings"
)
func grayCode(n int) []int {
  var l uint = 1 << uint(n)
  res := make([]int, l)
  for i := uint(0); i < l; i++ {
    res[i] = int((i >> 1) ^ i)
  }
  return res
}
func main() {
  fmt.Println(strings.Join(strings.Fields(fmt.Sprint(grayCode(2))), ","))
  fmt.Println(strings.Join(strings.Fields(fmt.Sprint(grayCode(1))), ","))
}

输出:

[0,1,3,2]

[0,1]


90. 子集 II Subsets II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例 1:

输入:nums = [1,2,2]

输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]


示例 2:

输入:nums = [0]

输出:[[],[0]]


提示:

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

代码:

package main
import (
  "fmt"
  "sort"
  "strings"
)
func subsetsWithDup(nums []int) [][]int {
  c, res := []int{}, [][]int{}
  sort.Ints(nums)
  for k := 0; k <= len(nums); k++ {
    generateSubsetsWithDup(nums, k, 0, c, &res)
  }
  return res
}
func generateSubsetsWithDup(nums []int, k, start int, c []int, res *[][]int) {
  if len(c) == k {
    b := make([]int, len(c))
    copy(b, c)
    *res = append(*res, b)
    return
  }
  for i := start; i < len(nums)-(k-len(c))+1; i++ {
    if i > start && nums[i] == nums[i-1] {
      continue
    }
    c = append(c, nums[i])
    generateSubsetsWithDup(nums, k, i+1, c, res)
    c = c[:len(c)-1]
  }
  return
}
func main() {
  nums := []int{1, 2, 2}
  res := subsetsWithDup(nums)
  fmt.Println(strings.Join(strings.Fields(fmt.Sprint(res)), ","))
}

输出:

[[],[1],[2],[1,2],[2,2],[1,2,2]]


🌟 每日一练刷题专栏 🌟

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

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

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

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

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


目录
相关文章
|
12天前
|
JSON JavaScript 前端开发
Golang深入浅出之-Go语言JSON处理:编码与解码实战
【4月更文挑战第26天】本文探讨了Go语言中处理JSON的常见问题及解决策略。通过`json.Marshal`和`json.Unmarshal`进行编码和解码,同时指出结构体标签、时间处理、omitempty使用及数组/切片区别等易错点。建议正确使用结构体标签,自定义处理`time.Time`,明智选择omitempty,并理解数组与切片差异。文中提供基础示例及时间类型处理的实战代码,帮助读者掌握JSON操作。
23 1
Golang深入浅出之-Go语言JSON处理:编码与解码实战
|
4月前
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
57 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
4月前
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
33 0
Linux 终端命令之文件浏览(2) more
|
4月前
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
23 0
Linux 终端操作命令(2)内部命令
|
4月前
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
39 0
力扣 C++|一题多解之动态规划专题(2)
|
4月前
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
41 0
Python Numpy入门基础(一)创建数组
|
7天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
31 0
|
5天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
134 1
|
6天前
|
缓存 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
【5月更文挑战第5天】本文介绍了Go语言项目中的CI/CD实践,包括持续集成与持续部署的基础知识,常见问题及解决策略。测试覆盖不足、版本不一致和构建时间过长是主要问题,可通过全面测试、统一依赖管理和利用缓存优化。文中还提供了使用GitHub Actions进行自动化测试和部署的示例,强调了持续优化CI/CD流程以适应项目需求的重要性。
45 1
|
6天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
49 1