454.四数相加II
func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {
res := 0
help := map[int]int{}
for _, val1 := range nums1 {
for _, val2 := range nums2 {
help[val1 + val2]++
}
}
for _, val1 := range nums3 {
for _, val2 := range nums4 {
res += help[-(val1 + val2)]
}
}
return res
}
383. 赎金信
func canConstruct(ransomNote string, magazine string) bool {
if len(ransomNote) > len(magazine) {
return false
}
help := [26]int{}
for _, ch := range magazine {
help[ch - 'a']++
}
for _, ch := range ransomNote {
help[ch - 'a']--
if help[ch - 'a'] < 0 {
return false
}
}
return true
}
15. 三数之和
文章详解
保证数字与上次枚举不重复,在每次循环初去重
三重搜索时,内层双指针界定边界(循环终止条件)
func threeSum(nums []int) [][]int {
n := len(nums)
sort.Ints(nums)
res := make([][]int, 0)
for i := 0; i < n; i++ {
if i > 0 && nums[i] == nums[i - 1] {
continue
}
for l, r := i + 1, n - 1; l < r; {
if sum := nums[i] + nums[l] + nums[r]; sum == 0 {
res = append(res, []int{nums[i], nums[l], nums[r]})
for l++; l < r && nums[l] == nums[l - 1]; l++{
}
for r--; l < r && nums[r] == nums[r + 1]; r-- {
}
}else if sum < 0 {
l++
}else{
r--
}
}
}
return res
}
18. 四数之和
文章详解
与三数之和类似,多加一层循环;双指针界定边界,获取到sum先判断,之后进行去重(完全同三数之和)
func fourSum(nums []int, target int) [][]int {
n := len(nums)
sort.Ints(nums)
res := make([][]int, 0)
for i := 0; i < n; i++ {
if i > 0 && nums[i] == nums[i - 1] {
continue
}
for j := i + 1; j < n; j++ {
if j > i + 1 && nums[j] == nums[j - 1] {
continue
}
for l, r := j + 1, n - 1; l < r; {
if sum := nums[i] + nums[j] + nums[l] + nums[r]; sum == target {
res = append(res, []int{nums[i], nums[j], nums[l] ,nums[r]})
for l++; l < r && nums[l] == nums[l - 1]; l++ {
}
for r--; l < r && nums[r] == nums[r + 1]; r-- {
}
}else if sum < target {
l++
}else {
r--
}
}
}
}
return res
}
总结
想明白还是简单的,多总结归纳,不着急。