leetcode 1. 两数之和

115 阅读1分钟

问题一 力扣题目链接

注意题目要求返回索引

利用哈希表(或者叫map、映射、字典、dictionary,意思都一样)求解(已提交通过)

func twoSum(nums []int, target int) []int {
    l := len(nums)
    if l < 2 {
        return nil
    }
    m := make(map[int]int) // 元素值->索引
    for i, n := range nums {
        a := target-n
        if j, ok := m[a]; ok {
            return []int{j,i}
        } else {
            m[n] = i
        }
    }
    return nil
}

问题二 稍加扩展

将原题改为“数组中的数可能有重复。找到和为target的两个数。答案可能有多个。返回值的多个二元组之间不能重复。你可以按任意顺序返回答案。找不到符合条件的数就返回空”。

nums=[3,3,2,1,1,4]target=5,返回[[3,2][1,4]]
nums=[1,1,1,2,3,5,-1,-1,-2]target=0,返回[[1,-1][2,-2]]
nums=[1]target=2,返回[]
nums=[]target=5,返回[]
nums=[1,2,7,5,6]target=1000,返回[]

这里给出一种实现(测试通过)

import "sort"

func twoSum(nums []int, target int) [][]int {
	length := len(nums)
	if length < 2 {
		return nil
	}
	sort.Sort(sort.IntSlice(nums)) // 排序
	var (
		l int
		r = length-1
		res [][]int
	)
	for l < r {
		lv := nums[l]
		rv := nums[r]
		sum := lv+rv
		if sum == target {
			res = append(res, []int{lv, rv})
		}
		if sum <= target {
			for l < r && nums[l] == lv { // 去重
				l++
			}
		}
		if sum >= target {
			for l < r && nums[r] == rv { // 去重
				r--
			}
		}
	}
	return res
}