哈希
同字母异序词判断
题目来源
精简解题
方法一
- 字符串排序
- 比较
方法二
- 使用map存储字符串中字母出现次数
- 比较
方法三
-
一维数组,字母做为下标统计出现次数
-
比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
func isAnagram(s string, t string) bool { if len(s) != len(t) { return false } table := [26]int{} for i := 0; i < len(s); i++ { table[s[i]-'a']++ } for i := 0; i < len(t); i++ { table[t[i]-'a']-- if table[t[i]-'a'] < 0 { return false } } return true }
两数之和
题目来源
精简解题
方法一
- 两个for循环
- 查找
方法二
- 排序
- 遍历
- 二分查找另一个数
方法三
-
使用hash,遍历i,找k-i是否存在
-
存在,记录下标返回
1 2 3 4 5 6 7 8 9 10 11 12 13
//小技巧,hash记录的key是k-i,value是i的下标 func twoSum(nums []int, target int) []int { m := make(map[int]int) for i, n := range nums { _, prs := m[n] if prs { return []int{m[n], i} } else { m[target-n] = i } } return nil }
三数之和
题目来源
精简解题
方法一
- 三个for循环
- 查找
方法二
- 遍历a
- 使用2Sum查找集合查找另两个数
方法三
-
排序
-
遍历a
-
左右指针遍历寻找三数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
func threeSum(nums []int) [][]int { var ret [][]int sort.Ints(nums) for i := 0; i < len(nums)-2; i++ { if i > 0 && nums[i] == nums[i-1] { continue } target, left, right := -nums[i], i+1, len(nums)-1 for left < right { sum := nums[left] + nums[right] if sum == target { ret = append(ret, []int{nums[i], nums[left], nums[right]}) left++ right-- for left < right && nums[left] == nums[left-1] { left++ } for left < right && nums[right] == nums[right+1] { right-- } } else if sum > target { right-- } else if sum < target { left++ } } } return ret } func threeSum2(nums []int) [][]int { var ret [][]int sort.Ints(nums) for i := 0; i < len(nums)-2; i++ { if i > 0 && nums[i] == nums[i-1] { continue } m := make(map[int]bool, len(nums)) for j := i + 1; j < len(nums); j++ { if _, ok := m[nums[j]]; ok { ret = append(ret, []int{nums[i], -nums[i] - nums[j], nums[j]}) } else { m[-nums[i]-nums[j]] = false } } } return ret }