[LC]88题 Merge Sorted Array (合并两个有序数组 )

时间:2019-09-14
本文章向大家介绍[LC]88题 Merge Sorted Array (合并两个有序数组 ),主要包括[LC]88题 Merge Sorted Array (合并两个有序数组 )使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

①英文题目

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:

The number of elements initialized in nums1 and nums2 are m and n respectively.
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.
Example:

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

Output: [1,2,2,3,5,6]

②中文题目:

给定两个有序整数数组 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]

③思路:这个题,倒序比顺序好做一些。首先想好,用3个变量来索引,i,j,k分别指向num1的末位、nums2的末位,混合后的数组的末位。每次处理完之后,都要减减1下。但其中要注意,只有参与了移动的索引才会减减1下。

              用while循环,i和j都大于等于0为条件。 两个数组元素相比,谁大就把谁赋值给混合数组的末位。

              另外,当i已经自减为负数而j还为正数(也就是说nums2数组长度比nums1长些)时,直接把剩余还没分配走的nums2的值,一一赋给混合数组的前几位。

             由于我就是把nums1当成混合后的数组,所以,当j自减为负数而i还是正数的时候,不用做任何处理了,也就是说,我的代码里的17-21行可以删除掉(我代码里已经写出来方便举例子)。

④代码:

 1 class Solution {
 2     public void merge(int[] nums1, int m, int[] nums2, int n) {
 3         int i=m-1;
 4         int j=n-1;
 5         int k=m+n-1;
 6         while(i>=0 && j>=0){
 7           if(nums1[i]>=nums2[j])
 8                 nums1[k--]=nums1[i--];
 9           else                 
10                 nums1[k--]=nums2[j--];
11         }
12         if( j>=0 ){
13             for(int p=0 ; p<j+1; p++){
14                 nums1[p] = nums2[p];
15             }  
16          }
17        // if( i>0  ){
18         //    for(int p=0 ; p<i+1;p++){
19         //    nums1[p]= nums1[p];
20         //    }  
21          //}
22     }
23 }

原文地址:https://www.cnblogs.com/zf007/p/11520760.html