zoukankan      html  css  js  c++  java
  • 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--;
            }
        }
    }
  • 相关阅读:
    docker 部署 禅道系统
    docker 部署 jenkins
    运筹方法
    软件工程基础知识
    操作系统知识
    程序设计语言基础知识
    计算机组成与配置
    oracle触发器
    性能测试监控工具的使用
    数据库设计范式
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4437147.html
Copyright © 2011-2022 走看看