88. 合并两个有序数组

题目大意

合并两个已经有序的数组,结果放在第一个数组中,第一个数组假设空间足够大。要求算法时间复杂度足够低。

解题思路

1.可以先吧nums2的数据全放在nums1 里面,然后再对nums1进行排序,时间复杂度O((m + n)log(m+n)) 

2.可以复制一份nums1的前m个数,然后从前往后依次对比nums1,nums2,时间复杂度O(m+n),空间复杂度O(m)

3.为了不大量移动元素,就要从2个数组长度之和的最后一个位置开始,依次选取两个数组中大的数,从第一个数组的尾巴开始往头放,只要循环一次以后,就生成了合并以后的数组了。时间复杂度O(m+n)

    public void merge(int[] nums1, int m, int[] nums2, int n) {

        int i = m - 1;

        int j = n - 1;

        int index = m + n - 1;

        while (i > -1 || j > -1) {

            if (i > -1 && j > -1) {

                if (nums1[i] > nums2[j]){

                    nums1[index] = nums1[i];

                    i--;

                } else {

                    nums1[index] = nums2[j];

                    j--;

                }

            } else if (i > -1) {

                nums1[index] = nums1[i];

                i--;

            } else {

                nums1[index] = nums2[j];

                j--;

            }

            index--;

        }

    }

你可能感兴趣的:(88. 合并两个有序数组)