LeetCode题目
454.四数相加II
题目链接:4Sum II - LeetCode
代码如下:
func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {
m := make(map[int]int)
count := 0
for _, v1 := range nums1 {
for _, v2 := range nums2 {
m[v1+v2]++
}
}
for _, v3 := range nums3 {
for _, v4 := range nums4 {
count += m[0-v3-v4]
}
}
return count
}
383.赎金信
代码如下:
func canConstruct(ransomNote string, magazine string) bool {
record := make([]int, 26)
for _, c := range magazine {
record[c-'a']++
}
for _, c := range ransomNote {
record[c-'a']--
if record[c-'a'] < 0 {
return false
}
}
return true
}
15.三数之和
题目链接:3Sum - LeetCode
代码如下:
func threeSum(nums []int) [][]int {
sort.Ints(nums)
result := [][]int{}
for i := 0; i < len(nums); i++ {
if nums[i] > 0 {
return result
}
if i > 0 && nums[i] == nums[i-1] {
continue
}
left := i + 1
right := len(nums) - 1
for right > left {
if nums[i]+nums[left]+nums[right] > 0 {
right--
} else if nums[i]+nums[left]+nums[right] < 0 {
left++
} else {
result = append(result, []int{nums[i], nums[left], nums[right]})
for right > left && nums[right] == nums[right-1] {
right--
}
for right > left && nums[left] == nums[left+1] {
left++
}
right--
left++
}
}
}
return result
}
18.四数之和
题目链接:4Sum - LeetCode
代码如下:
func fourSum(nums []int, target int) [][]int {
sort.Ints(nums)
result := [][]int{}
for k := 0; k < len(nums); k++ {
if nums[k] > target && nums[k] >= 0 {
break
}
if k > 0 && nums[k] == nums[k-1] {
continue
}
for i := k + 1; i < len(nums); i++ {
if nums[k]+nums[i] > target && nums[k]+nums[i] >= 0 {
break
}
if i > k+1 && nums[i] == nums[i-1] {
continue
}
left := i + 1
right := len(nums) - 1
for right > left {
if nums[k]+nums[i]+nums[left]+nums[right] > target {
right--
} else if nums[k]+nums[i]+nums[left]+nums[right] < target {
left++
} else {
result = append(result, []int{nums[k], nums[i], nums[left], nums[right]})
for right > left && nums[right] == nums[right-1] {
right--
}
for right > left && nums[left] == nums[left+1] {
left++
}
right--
left++
}
}
}
}
return result
}
总结
- 数组、set(集合)、map(映射)
- 双指针在数组问题中的运用