leetcode-88. 合并两个有序数组

168 阅读2分钟
import java.util.Arrays;

/**
 * ref:https://leetcode-cn.com/problems/merge-sorted-array
 * 给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。
 * 请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。
 * 注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。
 * 为了应对这种情况,nums1的初始长度为m+n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。
 * 输入: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]。
 */
public class MergeSortedArray {

    /**
     * 此题涉及归并排序思想:
     *    不断地将当前序列平均分割成2个子序列,直到不能再分割。(序列中只剩1个元素)
     *    不断地将2个子序列合并成一个有序序列,直到最终只剩下1个有序序列
     * 实现思路:
     * 1、定义两个下标index1和index2分别指向nums1和nums2两个数组的最后一个元素的常量,
     *  以及当前在填充数据下标curr指向nums1的最后一位置。
     * 2、比较nums1[index1]和nums2[index2],取较大者赋值给nums[curr],并对较大者下标和curr进行减1。
     * 3、继续进行下一轮处理,直到index2的下标小于0,则排序结束。
     * 4、针对nums1的数据为空时,需要直接将nums2的数据复制到num1中,此时需要直接将nums2的值赋值给nums1即可。
     * @param nums1
     * @param m
     * @param nums2
     * @param n
     */
    public static void marge(int[] nums1,int m,int nums2[],int n){
        // 数组num1的最大下标就是数组内数据长度-1
        int index1 = m -1;
        // 数组num1的最大下标就是数组内数据长度-1
        int index2 = n -1;
        // 当前处理数据的下标
        int curr = nums1.length-1;
        while(index2>=0){
            // 获取num1和num2中的最大的一个元素,进行比较。较大的一个放入num1的最后一个元素。继续下一轮迭代
            if(index1>0&&nums1[index1]>nums2[index2]) {
                nums1[curr--] = nums1[index1--];
            // 当nums1[index1]小于等于nums2[index]或者nums1为空,直接将nums2中元素赋值即可。    
            }else{
                nums1[curr--] = nums2[index2--];
            }
        }
    }

    public static void main(String[] args){
        // [1, 2, 2, 3, 5, 6]
        int[] nums1 = new int[]{1,2,3,0,0,0};
        int m = 3;
        int[] nums2 = new int[]{2,5,6};
        int n = 3;
        //[1]
        /*int[] nums1 = new int[]{1};
        int m = 1;
        int[] nums2 = new int[]{0};
        int n = 0;*/
        //[1]
       /* int[] nums1 = new int[]{0};
        int m = 0;
        int[] nums2 = new int[]{1};
        int n = 1;*/
        marge(nums1,m,nums2,n);
        System.out.println(Arrays.toString(nums1));
    }

}