zoukankan      html  css  js  c++  java
  • 合并两个有序数组-双指针-基于Go

    两个有序数组nums1和nums2,将nums2合并到nums1中,使nums1成为一个有序数组。

    初始化nums1和nums2的元素数量分别为m和n。
    假设nums1的空间大小等于m+n(足够)。

    • 一般解法,先拷贝,再排序
    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    func merge(nums1 []int, m int, nums2 []int, n int)[]int{
    	copy(nums1[m:], nums2)
    	sort.Ints(nums1)
    
    	return nums1
    }
    
    
    func main(){
    	var nums1 = [9]int{1,3,5,7,9}
    	var nums2 = [...]int{2,4,6,8}
    	fmt.Println(merge(nums1[:], 5, nums2[:],4))
    }
    
    • 使用双指针
    func merge2(nums1 []int, m int, nums2 []int, n int)[]int{
    	var nums1Copy = make([]int, m+n)
    	copy(nums1Copy, nums1)
    	var p1 = 0//指向nums1Copy
    	var p2 = 0//指向nums2
    	var p = 0//指向nums1
    	for p1<m && p2<n{
    		switch  {
    		case nums1Copy[p1]<=nums2[p2]:
    			nums1[p] = nums1Copy[p1]
    			p++
    			p1++
    		default:
    			nums1[p] = nums2[p2]
    			p++
    			p2++
    		}
    	}
    	if p1<m{//nums1Copy中的元素还未取完,已经取了p1个
    		copy(nums1[p:], nums1Copy[p1:])
    	}
    	if p2<n{//num2中的元素还为取完,已经取了p2个
    		copy(nums1[p:], nums2[p2:])
    	}
    
    	return nums1
    }
    
    • 双指针改进版(空间复杂度降低,不使用额外空间)
    func merge3(nums1 []int, m int, nums2 []int, n int)[]int{
    	// 从后往前遍历
    	// nums1[m-1] ... nums1[0]
    	// nums2[n-1] ... nums2[0]
    	var p1 = m-1
    	var p2 = n-1
    	var p = m+n-1
    	for p1>=0 && p2>=0{
    		switch {
    		case nums1[p1]>=nums2[p2]:
    			nums1[p] = nums1[p1]
    			p--
    			p1--
    		default:
    			nums1[p] = nums2[p2]
    			p--
    			p2--
    		}
    	}
    	if p1>0{//nums1中的元素还未取完
    		copy(nums1[:p], nums1[:p1])
    	}
    	if p2>0{//nums2中的元素还未取完
    		copy(nums1[:p], nums2[:p2])
    	}
    
    	return nums1
    }
    
  • 相关阅读:
    .NET 4.0 中的契约式编程
    DELL安装Windows Server 2019
    Mysql 5.7.34免安装版本
    MQTT
    WPF属性
    WPF数据绑定
    git系列之(五)git stash 命令
    Vue.js
    git 对比两个分支差异
    TPL 之二 TransformBlock
  • 原文地址:https://www.cnblogs.com/pangqianjin/p/14630843.html
Copyright © 2011-2022 走看看