公告

微信

欢迎大家私信交流

Skip to content

题目

自解

思路分析

  1. 有序递增 => 数组合并
  2. 冒泡排序,左大右小则交换

代码实现

go
func merge(nums1 []int, m int, nums2 []int, n int) {
  // nums1 合并 nums2
  // for i := 0; i < n; i++ {
  //   nums1[m+i] = nums2[i]
  // }

  // 优化1: 使用for range
  for i, v := range nums2 {
    nums1[m+i] = v
  }

  // nums内部开始冒泡排序
  for i := 0; i < len(nums1); i++ {
    for j := 0; j < len(nums1)-i; j++ {
      if j+1 == len(nums1) {
        break
      }
      if nums1[j] > nums1[j+1] {
        temp := nums1[j]
        nums1[j] = nums1[j+1]
        nums1[j+1] = temp
        fmt.Println(nums1)
      } else {
        fmt.Println(nums1)
      }
    }
  }

  fmt.Println(nums1)
}

他解

思路分析

  1. 初始化三个指针 p1=m一1指向nums1的未尾,p2=n-1指向nums2的末尾,p=m+n-1指向合并后的数组末尾
  2. 不断比较nums[p1]和nums[p2]的大小,将较大的值放入nums[p]中
  3. 当p1或者p2的项放进nums1后。当p2项多于p1项时,还需要将p2剩余的元素放入进去

代码实现

go
func merge(nums1 []int, m int, nums2 []int, n int) {
    // 双指针,从后往前合并
    p1 := m - 1
    p2 := n - 1
    p := m + n - 1

    for p1 >= 0 && p2 >= 0 {
        if nums1[p1] > nums2[p2] {
            nums1[p] = nums1[p1]
            p1--
        } else {
            nums1[p] = nums2[p2]
            p2--
        }
        p--
    }

    // 将剩余的nums2元素复制到nums1中
    for p2 >= 0 {
        nums1[p] = nums2[p2]
        p2--
        p--
    }
}

上次更新于: