• 合并两个有序数组-双指针-基于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
    }
    
  • 相关阅读:
    小球下落
    生成1~n的排列
    hdu1871无题
    android本地定时通知
    php 5.3起弃用session_register
    centos 6.3 编译安装 nginx +mysql + php
    skynet网络库socketserver
    mac下通过docker搭建LEMP环境
    Git操作
    iOS本地通知
  • 原文地址:https://www.cnblogs.com/pangqianjin/p/14630843.html
Copyright © 2020-2023  润新知