代码随想录算法训练营Day07 | 454.四数相加II、383.赎金信、15.三数之和、18.四数之和

65 阅读1分钟

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.赎金信

题目链接:Ransom Note - LeetCode

代码如下:

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
}

总结

  1. 数组、set(集合)、map(映射)
  2. 双指针在数组问题中的运用