首页 > 其他分享 >88. 合并两个有序数组

88. 合并两个有序数组

时间:2025-01-23 14:13:38浏览次数:1  
标签:数组 int 合并 merge 88 有序 nums1 nums2

package topinterview150

import (
	"sort"
	"testing"

	"github.com/stretchr/testify/assert"
)

/**
请你 合并 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
-109 <= nums1[i], nums2[j] <= 109


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

func merge(nums1 []int, m int, nums2 []int, n int) {
	// 不合法的情况
	if m < 0 || n < 0 {
		return
	}
	if len(nums1) != m+n || len(nums2) != n {
		return
	}

	// 这里已经排除了n是0的现象
	for i2 := n; i2 > 0; i2-- {
		// 计算得到nums1被插入下标
		insertM := m + i2 - 1
		nums1[insertM] = nums2[i2-1]
	}
	// 排序
	sort.Ints(nums1)
}

func TestMergeSortedArray(t *testing.T) {
	ast := assert.New(t)
	nums1 := []int{1, 2, 3, 0, 0, 0}
	nums2 := []int{2, 5, 6}
	merge(nums1, 3, nums2, 3)
	ast.Equal([]int{1, 2, 2, 3, 5, 6}, nums1)

	nums1 = []int{1}
	nums2 = []int{}
	merge(nums1, 1, nums2, 0)
	ast.Equal([]int{1}, nums1)

	nums1 = []int{0}
	nums2 = []int{1}
	merge(nums1, 0, nums2, 1)
	ast.Equal([]int{1}, nums1)
}

https://leetcode.cn/problems/merge-sorted-array

标签:数组,int,合并,merge,88,有序,nums1,nums2
From: https://www.cnblogs.com/liuscraft/p/18687665

相关文章

  • 代码随想录Day42 | 188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖
    代码随想录Day42|188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费188.买卖股票的最佳时机IV股票买卖通用代码模板classSolution{publicintmaxProfit(intk,int[]prices){intn=prices.length;......
  • js 数组 push() pop() shift() unshift() splice() sort() reverse() 的这些方法的用
    JavaScript的数组对象提供了多种方法来操作数组内容。以下是您提到的方法的简要说明和用法:1.`push()`-用途:向数组的末尾添加一个或多个元素,并返回新的长度。-语法:`array.push(element1,...,elementN)`-示例:`letarr=[1,2,3];arr.push(4);//arrisnow[1,......
  • 数组+贪心算法
    Problem:你可以获得的最大硬币数目思路用贪心思想考虑,在每一轮操作中,把最大的给Alice,如何把当前数组中次大的给自己,如何把最小的给Bob。以此类推,把数组的最小的三分之一给Bob即可,然后把剩下的交叉给Alice和自己。CodeclassSolution{publicintmaxCoins(int[]piles)......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方
    LeetCode7042025-01-2218:30:38星期三代码随想录视频内容简记梳理一下三个比较重要的部分首先是对于整个代码的循环条件,这个很重要判断middle位置在我看来初学也是比较重要一步注意:所有的middle位置判断都是if语句实现的,固定的大于和小于。这个不用纠结一不一样更......
  • 第五章 数组(附多道题型详细解析及代码)
    【以下就是关于数组的所有内容,如果您觉得这篇文章很好,请打赏一点心意,谢谢大家的支持】第一节 一维数组一、为什么要为什么要使用数组    通过前面几章的学习,我们已经可以编写程序来解决各种相当复杂的问题了,但是当需要处理的数据比较多时,仅依靠前面的知识是不够......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1,-1]。你必须设计并实现时间复杂度为 O(logn) 的算法解决此问题。 示例1:输入:nums=[5,7,7,8,8,10],tar......
  • ABC388G Simultaneous Kagamimochi 2
    问题描述有\(N\)个元团子(米团),按照大小升序排列。第\(i\)个元团子\((1≤i≤N)\)的大小是\(A_i\)。给定两个元团子\(A\)和\(B\),它们的大小分别是\(a\)和\(b\),你只有在\(a\)不超过\(b\)的一半时,才能通过将元团子\(A\)放在元团子\(B\)之上来制作一个元团子(ka......
  • 数组
    数组静态数组:是一块连续的内存空间,可以通过索引来访问这块内存空间的元素,是数组的原始形态动态数组:是编程语言为了我们方便使用,在静态数组的基础上添加了常用的api,如push、insert、remove等方法,可以让我们不用写代码去实现操作定义一个静态数组packagecom.wang.base.ar......
  • 井然有序之衡(2025牛客寒假算法基础集训营1)
    #include<bits/stdc++.h>#defineendl'\n'#defineintllusingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdi......
  • 《零基础Go语言算法实战》【题目 7-4】删除数组重复项,使每个元素只出现一次并返回新的
    《零基础Go语言算法实战》【题目7-4】删除数组重复项,使每个元素只出现一次并返回新的长度给定一个排序数组array,就地删除重复项,使每个元素只出现一次并返回新的长度。不要为另一个数组分配额外的空间,开发者必须通过使用空间复杂度为O(1)的额外内存就地修改输入数组来做到......