1 两数和

在数组中找到 2 个数之和等于给定值的数字,结果返回 2 个数字在数组中的下标。

  1. Given nums = [2, 7, 11, 15], target = 9,
  2. Because nums[0] + nums[1] = 2 + 7 = 9,
  3. return [0, 1]

思路:
哈希,遍历 O(n)

4 中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

思路:
有序 -> 二分
转化为寻找第K个数
分别对num1和num2进行二分,
A[k/2] 和B[k/2]比较,较小的可以直接排除。
截断条件思考:

  1. k/2超出了数组范围,在另外一个数组选取就好
  2. 当两个指针的和满足k时,截断。

明确k的含义:第k个数

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    m, n := len(nums1), len(nums2)
    if (m+n) % 2 == 1{
        return float64(getKthElement(nums1, nums2, (m+n+1)/2))
    } else {
        return float64(getKthElement(nums1, nums2, (m+n)/2) + getKthElement(nums1, nums2, (m+n)/2+1))/2
    }
}

func getKthElement(nums1, nums2 []int, k int) int {
    index1, index2 := 0, 0
    for {
        if index1 == len(nums1) {
            return nums2[index2 + k - 1]
        }
        if index2 == len(nums2) {
            return nums1[index1 + k - 1]
        }
        if k == 1 {
            return min(nums1[index1], nums2[index2])
        }
        half := k/2
        newIndex1 := min(index1 + half, len(nums1)) - 1
        newIndex2 := min(index2 + half, len(nums2)) - 1
        pivot1, pivot2 := nums1[newIndex1], nums2[newIndex2]
        if pivot1 <= pivot2 {
            k -= (newIndex1 - index1 + 1)
            index1 = newIndex1 + 1
        } else {
            k -= (newIndex2 - index2 + 1)
            index2 = newIndex2 + 1
        }
    }
    return 0
}

func min(x, y int) int {
    if x < y {
        return x
    }
    return y
}

作者:qian-long-wu-yong-11
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/solution/by-qian-long-wu-yong-11-0ild/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

11 最多雨水

给出一个非负整数数组 a1,a2,a3,…… an,每个整数标识一个竖立在坐标轴 x 位置的一堵高度为 ai 的墙,选择两堵墙,和 x 轴构成的容器可以容纳最多的水。

Input: [1,8,6,2,5,4,8,3,7]
Output: 49

思路:
双指针,从每次移动高度小的值。并维持一个最多雨水的ans

三数之和

给定一个数组,要求在这个数组中找出 3 个数之和为 0 的所有组合。

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

思路:O(n2),先排序,因为不允许重复多次。遍历first,使得second + third = - first。second和third使用双指针,复杂度为O(n)

移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]

思路:
双指针,慢指针指向待更新的数组下标位置,快指针指向新数组的元素位置。