[leetcode面试经典150题]-88-并两个有序数组

[leetcode面试经典150题]-88-并两个有序数组

从基础开始复习Go和Python


首先看一下题目,就是一个有序数组的合并。

给你两个按 非递减顺序 排列的整数数组 nums1​ 和 nums2​,另有两个整数 m​ 和 n​ ,分别表示 nums1​ 和 nums2​ 中的元素数目。

请你 合并 nums2​ 到 nums1​ 中,使合并后的数组同样按 非递减顺序 排列。

注意: 最终,合并后数组不应由函数返回,而是存储在数组 nums1​ 中。为了应对这种情况,nums1​ 的初始长度为 m + n​,其中前 m​ 个元素表示应合并的元素,后 n​ 个元素为 0​ ,应忽略。nums2​ 的长度为 n​.

目前的思路就是将空数组的情况单独拎出来处理,将非空数组挨个比较大小放入总长度为n+m​的数组中

func merge(nums1 []int, m int, nums2 []int, n int)  {
    var i,j int
    if m ==0 {
        nums1 = append(nums1,nums2...)
    }else if n==0{
        return
    }
    for i = m-1;i>=0;i--{
        for j=n-1;j>=0;j--{
            if nums1[i] >= nums2[j]{
                nums1[i+j+1] = nums1[i]
                break
            }else {
                nums1[i+j+1] = nums2[j]
            }

        }
    }

}

​​

然后发现在处理nums1为空的时候数组合并出现问题,分析发现原来是没有考虑到nums1是一个含有占位符的数组,需要修改nums1切片的返回

nums1 = append(nums1[:0], nums2...) 

然后发现再另一组数据中也出现了部分数据为0导致的问题,以及数组覆盖导致的问题
在这里插入图片描述

那么现在就得考虑这个问题

这里添加了一个新的数组,就可以去避免数组覆盖的问题,将两个数组从末尾开始进行放入,并且将最终的结果依次存入最终的数组中
在这里插入图片描述

func merge(nums1 []int, m int, nums2 []int, n int) {
    i, j, k := m-1, n-1, m+n-1
    for i >= 0 && j >= 0 {
        if nums1[i] > nums2[j] {
            nums1[k] = nums1[i]
            i--
        } else {
            nums1[k] = nums2[j]
            j--
        }
        k--
    }

    for j >= 0 {
        nums1[k] = nums2[j]
        j--
        k--
    }
}

这种方法是最终时间效率能达到最优的选择,但是同样也有一些次优的方法

比如说利用现成的函数

func merge(nums1 []int, m int, nums2 []int, n int)  {
    nums1 = append(nums1[:m], nums2[:n]...)
    sort.Ints(nums1)
}

其余效率更低的方法就没有太多的参考意义了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值