合并两个有序数组

1. 个人思路,从i=m处开始添加nums2元素,添加到m+n停止,再对数组进行排序:时间复杂度较高,未使用两个数组已经排序的特点

python代码:

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        for i in range(m, m+n):
            nums1[i] = nums2[i-m]
        nums1.sort()

java代码:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        for(int i=m;i<m+n;i++){
            nums1[i] = nums2[i-m];
        }
        Arrays.sort(nums1);
    }
}

C:

int cmp(const void *a, const void *b){
    return *(int*)a - *(int*)b;
}


void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    for(int i=m; i<m+n; i++){
        nums1[i]=nums2[i-m];
    }
    qsort(nums1, m+n, sizeof(int), cmp);
}

2. 双指针

思路:两个数组各一个指针,每次取出较小的放入队列,需要额外的数组空间

python

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        i=0
        j=0
        sorted=[]
        while i < m or j < n :
            if i == m:
                sorted.append(nums2[j])
                j += 1
            elif j == n:
                sorted.append(nums1[i])
                i += 1
            elif nums1[i]<=nums2[j]:
                sorted.append(nums1[i])
                i += 1
            else:
                sorted.append(nums2[j])
                j += 1
        nums1[:] = sorted

java

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] sorted = new int[m+n];
        int i=0,j=0;
        while(i<m || j<n){
            if(i == m){
                sorted[j+i]=nums2[j];
                j++;
            }
            else if(j == n){
                sorted[i+j]=nums1[i];
                i++;
            }
            else if(nums1[i]<nums2[j]){
                sorted[i+j]=nums1[i];
                i++;
            }
            else{
                sorted[j+i]=nums2[j];
                j++;
            }
        }
        for(int k=0;k<m+n;k++){
            nums1[k]=sorted[k];
        }
    }
}

C:

int cmp(const void *a, const void *b){
    return *(int*)a - *(int*)b;
}


void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int p1 = 0, p2 = 0;
    int sorted[m + n];
    int cur;
    while (p1 < m || p2 < n) {
        if (p1 == m) {
            cur = nums2[p2++];
        } else if (p2 == n) {
            cur = nums1[p1++];
        } else if (nums1[p1] < nums2[p2]) {
            cur = nums1[p1++];
        } else {
            cur = nums2[p2++];
        }
        sorted[p1 + p2 - 1] = cur;
    }
    for (int i = 0; i != m + n; ++i) {
        nums1[i] = sorted[i];
    }

}

3. 逆序双指针

nums1后面是空的,因此可以从后往前塞,从大到小塞,无需额外空间,时间复杂度O(m+n)

python

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        p1, p2 = m - 1, n - 1
        tail = m + n - 1
        while p1 >= 0 or p2 >= 0:
            if p1 == -1:
                nums1[tail] = nums2[p2]
                p2 -= 1
            elif p2 == -1:
                nums1[tail] = nums1[p1]
                p1 -= 1
            elif nums1[p1] > nums2[p2]:
                nums1[tail] = nums1[p1]
                p1 -= 1
            else:
                nums1[tail] = nums2[p2]
                p2 -= 1
            tail -= 1

java

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m - 1, p2 = n - 1;
        int tail = m + n - 1;
        int cur;
        while (p1 >= 0 || p2 >= 0) {
            if (p1 == -1) {
                cur = nums2[p2--];
            } else if (p2 == -1) {
                cur = nums1[p1--];
            } else if (nums1[p1] > nums2[p2]) {
                cur = nums1[p1--];
            } else {
                cur = nums2[p2--];
            }
            nums1[tail--] = cur;
        }
    }
}

C

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int p1 = m - 1, p2 = n - 1;
    int tail = m + n - 1;
    int cur;
    while (p1 >= 0 || p2 >= 0) {
        if (p1 == -1) {
            cur = nums2[p2--];
        } else if (p2 == -1) {
            cur = nums1[p1--];
        } else if (nums1[p1] > nums2[p2]) {
            cur = nums1[p1--];
        } else {
            cur = nums2[p2--];
        }
        nums1[tail--] = cur;
    }
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值