LeetCode每日一题--合并两个有序数组
2020-03-15 18:21
477 查看
【前言】坚持日更LeetCode刷题系列
不积跬步,无以至千里;不积小流,无以成江海。愿与诸君共勉!
【题目】88.合并两个有序数组
题目描述:给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
示例 1: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6]
思路一:将nums2中的元素代替nums1中用于存储而保留位置的‘0’,再对其使用排序函数即可。具体代码如下:
class Solution(object): def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: None Do not return anything, modify nums1 in-place instead. """ nums1.reverse() #通过将列表反转,便于替换操作 for i in range(len(nums2)): nums1[i] = nums2[i] return nums1.sort()
运行结果:
思路二:定义两个flag,初值为0,分别标记nums1,nums2当前判断位置,如果nums1<=nums2,则将nums1的值保存,flag1加一,否则保存nums2的值,flag2加一,但注意如果此时flag1==n,或者 flag2 ==m,则跳出判断,并将未判断的值直接添加。具体内容如下:
class Solution(object): def merge(self,nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: None Do not return anything, modify nums1 in-place instead. """ nums1_copy = nums1[:] #复制nums1 flag_1 = 0 #标记,作指针用 flag_2 = 0 #标记,作指针用 count = 0 #用于判断终止的条件 while count < m+n: if flag_1 == m: #此时将nums2内未判断的值加入 nums1 = nums1[:m+n-flag_2-1] + nums2[flag_2:] break elif flag_2 == n: #将nums1内未判断的值加入 nums1 = nums1[:] + nums1[flag_1:m+n] break else: if(nums1_copy[flag_1]<=nums2[flag_2]): #如果小于nums2内值,则将nums1内值存入,flag1加一 nums1[count] = nums1_copy[flag_1] flag_1 = flag_1+1 count = count+1 else: #如果大于nums2内值,则将nums2内值存入,flag2加一 nums1[count] = nums2[flag_2] flag_2 = flag_2+1 count = count+1 return nums1
运行结果:未通过编译,我当时甚至一度怀疑人生,因为我print出来的nums1和return的nums1在同一个位置,但出现了不同值,不过直到后来我看到了题目中的
None Do not return anything, modify nums1 in-place instead我才意识到事情不是我想象的那样,这也算给自己一个警示把,下面附上官方类似思路解答的代码。
class Solution(object): def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: void Do not return anything, modify nums1 in-place instead. """ # Make a copy of nums1. nums1_copy = nums1[:m] nums1[:] = [] # Two get pointers for nums1_copy and nums2. p1 = 0 p2 = 0 # Compare elements from nums1_copy and nums2 # and add the smallest one into nums1. while p1 < m and p2 < n: if nums1_copy[p1] < nums2[p2]: nums1.append(nums1_copy[p1]) p1 += 1 else: nums1.append(nums2[p2]) p2 += 1 # if there are still elements to add if p1 < m: nums1[p1 + p2:] = nums1_copy[p1:] if p2 < n: nums1[p1 + p2:] = nums2[p2:] 作者:LeetCode 链接:https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-by-leetcode/ 来源:力扣(LeetCode)
运行结果:
果然,官方就是官方,虽然同一个思路,但是代码的简洁性相比较,根本不在一个量级,所以需要改进的地方还很多!此外,官方还提供了一种独特的优化思路二的做法,在下面我会附上链接,有兴趣的朋友可以自行查看。
关于其中一些知识的链接:
分享就到这里了,欢迎大家一起交流讨论。
注明:
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
- 点赞 2
- 收藏
- 分享
- 文章举报
相关文章推荐
- [LeetCode] Merge Sorted Array 合并两个有序数组
- Leetcode 88. 合并两个有序数组
- Leetcode【Go语言】合并两个有序数组
- LeetCode题目(c++实现):合并两个有序数组
- LeetCode—88. 合并两个有序数组
- Leetcode合并两个有序数组算法与分析
- 【LeetCode】88 合并两个有序数组
- LeetCode 88. 合并两个有序数组
- leetcode 刷题记录(高频算法面试题汇总)--合并两个有序数组
- LeetCode - 88. 合并两个有序数组
- leetcode之数组类之数组的旋转与分治类-----OJ 189/33/81/153/154 数组旋转 旋转数组搜索 88 有序数组合并 4 两个有序数组寻找第K个元素/中位数 35 寻找插入位置
- [LeetCode]88. 合并两个有序数组
- Leetcode刷题27-88.合并两个有序数组(C++)
- Leetcode 88 Merge Sorted Array 合并两个有序数组
- leetcode-腾讯精选练习(50 题)python #88合并两个有序数组
- Leetcode88. 合并两个有序数组(python)
- LeetCode合并两个有序数组C++版
- leetcode 88. 合并两个有序数组
- Python LeetCode(88.合并两个有序数组)
- 【LeetCode】[88] 合并两个有序数组