LeetCode算法题88:合并两个有序数组解析

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

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

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

这个题第一个想法是创建一个新的数组,因为题目也没有限定,创建新的数组后直接逐个比较两个数组元素(需要设定两个索引)然后放到新数组中,最后再将新数组内容放到num1中,但是这样的话,空间复杂度提高了O(n),时间复杂度也变为O(2n),所以还是在原数组上进行操作。在原数组上进行操作时需要注意不能从前面进行操作,因为会破坏要比较的数字,所以只能从后往前遍历,遍历时方法是一样的,需要设定三个索引,一个是num1前面要比较数字的索引,一个是num2的索引,还有一个是整个num1从后往前的索引,然后比较放入即可,需要注意的是,比较完之后一定会进行索引自减的操作,所以要注意不要超出操作边界,判断条件要充分考虑。
C++源代码:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        if (n>0)
        {   
            int total = m + n;
            int i=m-1, j=n-1, k=total-1;
            while (total--)
            {
                if (i<0||(j>=0&&nums1[i]<nums2[j]))
                    nums1[k--] = nums2[j--];
                else
                    nums1[k--] = nums1[i--];
            }
        }
    }
};

python3源代码:

class Solution:
    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.
        """
        nums1[m:] = nums2[:]
        nums1.sort()

python由于使用的是list,list有好的方法可以直接排序,所以只要两个列表拼起来,用sort()方法排序即可,这个不涉及算法,只是对语言掌握的练习,算法还是看C++代码。

你可能感兴趣的:(Leetcode算法题分析)