当前位置: 首页 > article >正文

Golang每日一练(leetDay0030)

目录

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

89. 格雷编码 Gray Code  🌟🌟

90. 子集 II Subsets II  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


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

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

请你 合并 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] 内(含 0 和 2n - 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/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


http://www.kler.cn/a/9749.html

相关文章:

  • 【Linux】-学习笔记03
  • leetcode hot100【LeetCode 114.二叉树展开为链表】java实现
  • K8s进阶使用
  • 重新认识HTTPS
  • 推荐一个超漂亮ui的网页应用设计
  • void * 指针与整数进行加减运算
  • CDH 之 Kerberos 安全认证和 Sentry 权限控制管理(一)
  • 指令系统和寻址方式
  • 【C语言】switch语句的理解
  • 【RocketMQ】消息的拉取
  • 发布jar到maven中央仓库
  • 简单实用的IntelliJ IDEA集成配置Maven教程:高效构建Java项目
  • MAC 删除自带 ABC 输入法的方法
  • maya arnold自定义aov分层灯光组添加方法
  • 算法笔记-换根DP
  • OKR系统改变您的团队
  • 【职场篇】程序员是否吃青春饭?程序员在35岁之后是否需要转行?
  • Thingsboard开源物联网平台智慧农业实例快速部署教程(三)【源码部署及logo更换】
  • 延迟渲染到最终结果---大象无形(11.3.1)--2,PrePass预处理阶段--<1>判断是否预处理
  • 全球十大正规黄金期货交易APP平台排名(2023版榜单)
  • C# 获取当前设备硬件信息
  • (二)nvidia jetson orin nvcsi tegra-capture-vi camera相关内容梳理 之 nvcsi相关代码分析
  • 聚观早报 | ChatGPT 停止 Plus 付费;李子柒油管广告收益登顶热搜
  • 纺织工业库房如何有效防潮?恒温恒湿真的有效吗?
  • 从中序和前序遍历序列构造二叉树
  • 系统集成项目管理工程师软考第一章习题(已完结)