学习目标:
- 掌握几种基本的算法结构,实现算法问题解决的基本思维
学习内容:
题目:合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 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 中。
题解明细:
思路:(投机取巧解法)
学习笔记:
1、直接的方法:既然nums1中位置已经留好了,直接把nums2中的元素一个个替换进去就好了,也没有什么特殊情况。最后用一个sort()把它排成升序。
2、看到了一个大神想到的方法,这里可以分享给大家:
题目要求输出的结果是num1中有m+n个元素,非降序全部排好,我们称要排好的数组为扩展nums1数组:也就是像填空一样,把合适的数字逐个放到扩展nums1数组的第m+n-1位子到第0个位子(i:m+n-1,0)
那么我们就对数组nums2(第n-1个数字到第0个数字),和数组nums1(第m-1个数字到第0个数字)进行遍历,取2者之中比较大的一个放到第i个位子
边界情况:如果num2已经处理完,那么剩下的就不用处理了,直接退出
如果num1已经处理完,那么接下来肯定每次都是取nums2的数字,不用再比较了
学习产出:
- CSDN 技术笔记 1遍
- CSDN
- leetcode 题目闭环 1个
- . - 力扣(LeetCode)