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这个数组的基础上进行合并。如果没有这个要求,当然很容易了,另开一个数组,然后用两个指针比较头节点的大小,add到新的数组里。
但是因为要求在nums1中完成,所以依然依靠双指针的思想。
第一个想法是两个指针从头到尾遍历,然后nums1每个位置元素向后挪的这种思想,结果发现不行,没有办法处理例子所示的5和6两种情况。因为0既可能是数字出现,也可能是作为补位出现。
第二个想法:从两个指针都从后往前,因为数组开的足够大,所以可以直接使用替换的方法来做。非常巧妙的思路。
代码如下:
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 while ( j >= 0 ){ 13 nums1[k--] = nums2[j--]; 14 } 15 } 16 }
运行时间3ms。
总结:找到实习之后有一个月没有刷题了,被师兄一语点醒梦中人。还是要不停的充实自己。以后保证每天至少刷一个题,即使在上班时也要抽空刷题!加油!