题目:
Given two sorted integer arrays A and B, merge B into A as one sorted array.
Note:
You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are mand n respectively.
链接: http://leetcode.com/problems/merge-sorted-array/
题解: 从后向前比较。 Time Complexity - O(m + n), Space Complexity - O(1)。
public class Solution { public void merge(int A[], int m, int B[], int n) { while(m > 0 && n > 0){ if(A[m - 1] >= B[n - 1]) { A[m + n - 1] = A[m - 1]; m --; } else { A[m + n - 1] = B[n - 1]; n --; } } while(n > 0){ A[m + n - 1] = B[n - 1]; n --; } } }
Update:
public class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { if(nums1 == null || nums2 == null) return; int k = m - 1, l = n - 1; for(int i = m + n - 1; i >= 0; i--) { if(k >= 0 && l >= 0) nums1[i] = (nums1[k] > nums2[l]) ? nums1[k--] : nums2[l--]; else if (k < 0) nums1[i] = nums2[l--]; else if (l < 0) return; } } }
二刷:
Java:
Time Complexity - O(m + n), Space Complexity - O(1)。
public class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { if (nums1 == null || nums2 == null) { return; } while (m > 0 || n > 0) { if (m > 0 && n > 0) { nums1[m + n - 1] = nums1[m - 1] > nums2[n - 1] ? nums1[m-- - 1] : nums2[n-- - 1]; } else if (n > 0) { nums1[n - 1] = nums2[n-- - 1]; } else { break; } } } }
三刷:
3/18/2016: 这道题在Microsoft onsite第四轮里还真被问到了,赶紧使用二刷的方法秒了。结果最后通过recruiter询问到的feedback是 : coding is rough。翻译过来就是, 写得太糙...... 看来真的不应该用太多的 ++, -- 和tenary operator。所以这一遍老老实实地写。
我们先确定边界条件。然后再m > 0 并且n > 0的情况下对数组nums1进行从后向前地遍历。 当nums1的最后一个元素nums1[m - 1]比nums2的最后一个元素nums2[n - 1]大的时候,nums1[m + n - 1] = nums1[m - 1],并且我们设置m--,比较下一个元素。否则nums[m + n - 1] = nums2[n - 1],n--。 循环结束后,我们判断n是否仍然大于0, 如果是的话,此时m为0, 我们继续更新nums1[n - 1] = nums2[n - 1], n--。
Java:
Time Complexity - O(m + n), Space Complexity - O(1)
public class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { if (nums1 == null || nums2 == null || m < 0 || n < 0) { return; } while(m > 0 && n > 0) { if (nums1[m - 1] > nums2[n - 1]) { nums1[m + n - 1] = nums1[m - 1]; m--; } else { nums1[m + n - 1] = nums2[n - 1]; n--; } } while (n > 0) { nums1[n - 1] = nums2[n - 1]; n--; } } }
Update:
public class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { if (nums1 == null || nums2 == null || nums1.length == 0) return; while (m > 0 && n > 0) { if (nums1[m - 1] > nums2[n - 1]) { nums1[m + n - 1] = nums1[m - 1]; m--; } else { nums1[m + n - 1] = nums2[n - 1]; n--; } } while (n > 0) { nums1[n - 1] = nums2[n - 1]; n--; } } }