算法题面试题golang

发布时间:2024-12-23 03:44:59

解题思路 一、题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 nums1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 的空间大小等于 m + n。 二、解题思路 本题是一个合并有序数组的问题,我们可以使用双指针的方法来解决。 具体的思路如下: 1、定义两个指针 p1 和 p2,分别表示 nums1 和 nums2 的已排序部分的末尾位置。 2、初始化 p1 = m-1,p2 = n-1。 3、从右往左遍历 nums1,比较 nums1[p1] 和 nums2[p2] 的大小,将较大值放到 nums1 的末尾。 4、重复步骤 3,直到 p2 < 0 或者 p1 < 0。 5、如果 p2 >= 0,则将 nums2 中剩余的元素复制到 nums1 的前面。 代码实现 下面是使用上述思路编写的 Golang 代码实现: func merge(nums1 []int, m int, nums2 []int, n int) { p1 := m - 1 p2 := n - 1 p := m + n - 1 for p2 >= 0 { if p1 >= 0 && nums1[p1] > nums2[p2] { nums1[p] = nums1[p1] p1-- } else { nums1[p] = nums2[p2] p2-- } p-- } for p2 >= 0 { nums1[p] = nums2[p2] p2-- p-- } } 解题效果验证 我们可以使用一个简单的测试用例来验证上面的代码是否正确。 func main() { nums1 := []int{1, 2, 3, 0, 0, 0} m := 3 nums2 := []int{2, 5, 6} n := 3 merge(nums1, m, nums2, n) fmt.Println(nums1) } 输出结果为 [1, 2, 2, 3, 5, 6],与预期结果相符。 思考拓展 本题是合并两个有序数组,我们也可以考虑使用归并排序的思想来解决。 具体的思路如下: 1、定义一个辅助数组 temp,用于存储合并后的数组。 2、初始化指针 i,j 和 k,分别表示 nums1,nums2 和 temp 的起始位置。 3、比较 nums1[i] 和 nums2[j] 的大小,将较小值放入 temp[k] 中,并将指针向后移动一位。 4、重复步骤 3,直到 i >= m 或者 j >= n。 5、将 nums1 剩余的元素复制到 temp 中。 6、将 temp 复制回 nums1。 此方法的时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 (以下是Golang代码版示例) func merge(nums1 []int, m int, nums2 []int, n int) { temp := make([]int, m+n) i, j, k := 0, 0, 0 for i < m && j < n { if nums1[i] <= nums2[j] { temp[k] = nums1[i] i++ } else { temp[k] = nums2[j] j++ } k++ } for i < m { temp[k] = nums1[i] i++ k++ } for j < n { temp[k] = nums2[j] j++ k++ } copy(nums1, temp) } 拓展思考验证 我们可以使用一个简单的测试用例来验证上面的代码是否正确。 func main() { nums1 := []int{1, 2, 3, 0, 0, 0} m := 3 nums2 := []int{2, 5, 6} n := 3 merge(nums1, m, nums2, n) fmt.Println(nums1) } 输出结果为 [1 2 2 3 5 6],与预期结果相符。 结语 通过双指针的方法,我们可以高效地解决合并有序数组的问题。在实际开发中,我们可以根据具体情况选择合适的算法和数据结构,以避免不必要的计算和内存消耗。希望本文对你有所帮助,谢谢阅读!

相关推荐