88. Merge Sorted Array

题目:

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--;
        }
    }
}

 

posted @ 2015-04-18 12:08  YRB  阅读(342)  评论(0编辑  收藏  举报