第454题.四数相加II
思路:因为是统计次数,不用考虑坐标和去重复,那我就可以把value值给想成该target出现的次数。先用两个数组构造哈希表,然后再用一个O(n*n)的双重循环,遍历剩下两个数组,用count统计出现次数。
func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {//index valuehashmap_single := map[int]int{} for _, i2 := range nums1{for _,j2 := range nums2{hashmap_single[i2 + j2]++}}count := 0for _, i2 := range nums3{for _,j2 := range nums4{sum := -i2 - j2if value,find := hashmap_single[sum];find{count += value}}}return count }
383. 赎金信
思路:将一个字符放进哈希表,然后遍历另一个数组,看他拥有的字符是不是能完全消除,字母够不够,够的话就能构造func canConstruct(ransomNote string, magazine string) bool {hash := map[rune]int{}for _,i2 := range magazine{hash[i2]++}for _,i2 := range ransomNote{if hash[i2] == 0{return false}hash[i2]--}return true }
383. 三数之和
思路:固定一个开头,然后向后遍历,依次存入hash表出现的数字,然后回头找。然后排序可以帮助去重。
func threeSum(nums []int) [][]int {var res [][]intn := len(nums)if n < 3 {return res}// 先排序,为去重做准备sort.Ints(nums)for i := 0; i < n-2; i++ {// 去重:第一个数重复时跳过(避免重复三元组)if i > 0 && nums[i] == nums[i-1] {continue}// 哈希表存储 i 之后的元素(值 -> 索引)seen := make(map[int]bool)for j := i + 1; j < n; j++ {target := -nums[i] - nums[j]// 检查哈希表中是否存在目标值(即第三个数)if seen[target] {// 找到有效三元组,加入结果集res = append(res, []int{nums[i], nums[j], target})// 去重:第二个数重复时跳过(避免同一i下的重复三元组)for j+1 < n && nums[j] == nums[j+1] {j++}}// 将当前j对应的元素存入哈希表,供后续j'(j' > j)查找seen[nums[j]] = true}}return res }