q1两数之和
题解
leecode中的第一道题,用暴力就能做出来,但用hash表能够降低时间复杂度。循环遍历数组,i
和x
分别是下标和当前遍历到的数,如果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
}