Skip to content

Latest commit

 

History

History
143 lines (123 loc) · 2.88 KB

0088._merge_sorted_array.md

File metadata and controls

143 lines (123 loc) · 2.88 KB

Navigation

Links:

  1. https://leetcode.com/problems/merge-sorted-array/
  2. https://leetcode-cn.com/problems/merge-sorted-array/

Tags

  1. 数组
  2. 双指针

Solution 1 API

m为有效数字的个数,所以len(nums) - m为要删除的0的个数。 合并后排序

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        for _ in range(len(nums1) - m):
            nums1.remove(0)
        nums1.extend(nums2)
        nums1.sort()

class Solution:
    def merge(self, nums1, m, nums2, n):

        nums1[:] = sorted(nums1[:m] + nums2[:n])    # 可以是nums2。nums2[:n]为了对齐

Go

func merge(nums1 []int, m int, nums2 []int, _ int) {
    copy(nums1[m:], nums2)
    sort.Ints(nums1)
}

Solution 2 双指针 / 从前往后

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        nums1_copy = nums1[:m] 
        nums1[:] = []

        p1 = 0 
        p2 = 0
        
        while p1 < m and p2 < n: 
            if nums1_copy[p1] < nums2[p2]: 
                nums1.append(nums1_copy[p1])
                p1 += 1
            else:
                nums1.append(nums2[p2])
                p2 += 1

        if p1 < m: 
            nums1[p1 + p2:] = nums1_copy[p1:]
        if p2 < n:
            nums1[p1 + p2:] = nums2[p2:]

Go

func merge(nums1 []int, m int, nums2 []int, n int) {
	sorted := make([]int, 0, m+n)
	p1, p2 := 0, 0

	for p1 < m && p2 < n {
		if nums1[p1] < nums2[p2] {
			sorted = append(sorted, nums1[p1])
			p1++
		} else {
			sorted = append(sorted, nums2[p2])
			p2++
		}
	}

	if p1 == m {
		sorted = append(sorted, nums2[p2:]...)
	} else {
		sorted = append(sorted, nums1[p1:]...)
	}

	copy(nums1, sorted)
}

Solution 3 三指针 / 从后往前

从前往后是塞小的元素且需要额外空间。从后往前塞大的元素,不需要额外空间。

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        p1 = m - 1
        p2 = n - 1

        p = m + n - 1
        
        while p1 >= 0 and p2 >= 0:
            if nums1[p1] < nums2[p2]:
                nums1[p] = nums2[p2]
                p2 -= 1
            else:
                nums1[p] =  nums1[p1]
                p1 -= 1
            p -= 1
        
        nums1[:p2 + 1] = nums2[:p2 + 1]

Go

func merge(nums1 []int, m int, nums2 []int, n int) {
	p, q := m-1, n-1
	tail := m + n - 1

	for p >= 0 || q >= 0 {
		if p == -1 {
			nums1[tail] = nums2[q]
			q--
		} else if q == -1 {
			nums1[tail] = nums1[p]
			p--
		} else if nums1[p] > nums2[q] {
			nums1[tail] = nums1[p]
			p--
		} else {
			nums1[tail] = nums2[q]
			q--
		}

		tail--
	}
}