Leetcode_hash相关


q1两数之和


题目传送门


题解

leecode中的第一道题,用暴力就能做出来,但用hash表能够降低时间复杂度。循环遍历数组,ix分别是下标和当前遍历到的数,如果target - x存在于hash表中,那就直接返回这两个数在数组中的下标;反之,就将当前的数和它的下标存到hash表中。

func twoSum(nums []int, target int) []int {
	hashTable := map[int]int{}
	for i, x := range nums {
		if p, ok := hashTable[target - x]; ok {
			return []int{p, i}
		}
		hashTable[x] = i
	}
	return nil
}

q49 字母异位词分组


题目传送门


题解

这道题我本来想用map来求解,但是后面发现不知道用什么来作为字母异位词的key。后面看了官方题解才明白:字母异位词的相同的字母个数是相同的,所以我们可以使用一个大小为26的数组来统计单词中每个字母的个数,并以此来作为map的key。最后将字母异位词添加进map即可。

func groupAnagrams(strs []string) (res [][]string) {
	mp := make(map[[26]int][]string)
	// 遍历字符串数组,将字母异位词放在map的同一个位置
	for _, str := range strs {
		var arr [26]int
		// 统计一个单词的字母个数
		for _, b :=  range str {
			arr[b - 'a']++
		}
		// 通过统计相同的字母个数实现字母异位词的key
		mp[arr] = append(mp[arr], str)
	}
	// 将map中的字母异位词拼接到res二维数组中
	for _, str := range mp {
		res = append(res, str)
	}
	return
}

q387字符串中的第一个唯一字符


题目传送门


题解

遍历两次字符串,第一次使用hash表储存字符和字符出现的次数,第二次遍历直接返回出现次数为1的字符下标。

func firstUniqChar(s string) int {
	hashTable := make(map[byte]int)
	for _, v := range s {
		hashTable[byte(v)]++
	}
	for k, v := range s {
		if hashTable[byte(v)] == 1 {
			return k
		}
	}
	return -1
}

剑指 Offer 57. 和为s的两个数字


题目传送门


题解

解法同两数之和。

func twoSum(nums []int, target int) []int {
	hashTable := make(map[int]int)
	for i, v := range nums {
		if _, ok := hashTable[target-v]; ok {
			return []int{v, target - v}
		}
		hashTable[v] = i
	}
	return nil
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值