[1679] K 和数对的最大数目
给你一个整数数组 nums 和一个整数 k 。
每一步操作中,你需要从数组中选出和为 k 的两个整数,并将它们移出数组。
返回你可以对数组执行的最大操作数。
示例 1:
输入:nums = [1,2,3,4], k = 5
输出:2
解释:开始时 nums = [1,2,3,4]:
输入:nums = [3,1,3,4,3], k = 6
输出:1
解释:开始时 nums = [3,1,3,4,3]:
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
1 <= k <= 10^9
题目是要找到和为k的数对,可以用哈希法和双指针法解决
根据题意一个数字用完后会删除,所以一个数字最多只用一次。利用贪心原理,去遍历数组,找到另一个数字并从中删除。这就转化成从数组中找出和为k的对数。和之前的两数之和、三数之和、四数之和的题类似。有2种做法一种是直接哈希法,另一种是排序以后用双指针法。
func maxOperations(nums []int, k int) int {
m:= make(map[int]int, len(nums)) //
sum := 0
for _, n:= range nums {
if m[n]>0 {
sum++
m[n]--
} else {
m[k-n]++ // 这里存储的相减后的结果
}
}
return sum
}
func maxOperations(nums []int, k int) int {
m:= make(map[int]int, len(nums)) //
sum := 0
for _, n:= range nums {
if m[n]>0 {
sum++
m[n]--
} else {
m[k-n]++ // 这里存储的相减后的结果
}
}
return sum
}
func maxOperations(nums []int, k int) int {
sort.Sort(nums)
sum := 0
left, right := 0, len(nums)-1
// nums[left]
for ;left<right; {
if nums[left]+nums[right] == k {
sum++
left++
right--
} else if nums[left]+nums[right] < k { // 说明小的数字要增大
left++
} else { // 大的数字要减少
right--
}
}
return sum
}
func maxOperations(nums []int, k int) int {
sort.Sort(sort.IntSlice(nums))
sum := 0
left, right := 0, len(nums)-1
// nums[left]
for ;left<right; {
if nums[left]+nums[right] == k {
sum++
left++
right--
} else if nums[left]+nums[right] < k { // 说明小的数字要增大才有可能使和=k
left++
} else { // 大的数字要减少,同理。
right--
}
}
return sum
}
https://leetcode-cn.com/problems/two-sum/
https://leetcode-cn.com/problems/3sum/
https://leetcode-cn.com/problems/4sum/