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

三级目录

[454].四数相加 II

题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html

思路 相加等于0那么就代表 v1+v2+v3+v4=0

v1+v2=-v3-v4

先遍历出nums1 nums2两个的组合

然后找到 -v3-v4等于的就出结果了

func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {
	mp1 := make(map[int]int)
	count := 0
	for _, v1 := range nums1 {
		for _, v2 := range nums2 {
			mp1[v1+v2]++
		}
	}
	//v1+v2+v3+v4=0    v1+v2=-v3-v4
	for _, v3 := range nums3 {
		for _, v4 := range nums4 {
			count += mp1[-v3-v4]

		}
	}
	return count

}

[383].赎金信

题目链接/文章讲解:https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html

思路: 可以用map 先加上 然后再减 小于零就代表没有

遍历反了 需要magazine满足 ransomNote 所以先遍历magazine

func canConstruct(ransomNote string, magazine string) bool {
	if len(ransomNote)>len(magazine){
		return false
	}
	mp1:=make(map[rune]int)

	for _, v := range magazine {
		mp1[v]++
	}
	for _, v := range ransomNote {
		mp1[v]--
		if mp1[v]< 0{
			return false
		}
	}
	return true

}
func canConstruct(ransomNote string, magazine string) bool {
	for i := 0; i < len(magazine); i++ {
		for j := 0; j < len(ransomNote); j++ {
			if  magazine[i]== ransomNote[j] {
				ransomNote = ransomNote[:j] + ransomNote[j+1:]
				break
			}

		}

	}
	if len(ransomNote) == 0 {
		return true
	}
	return false

}

[15].三数之和

题目链接/文章讲解/视频讲解:https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html

思路: 固定一个数然后 两个指针l和r 一个从右边 一个从左边

去重 然后就出来嘞 很简单

func threeSum(nums []int) [][]int {
	sort.Ints(nums)
	res:=[][]int{}

	for i := 0; i < len(nums)-2; i++ {
		n1:=nums[i]

		if n1>0{
			break
		}
		if i>0&&n1 ==nums[i-1]{
			continue
		}
		l,r:= i+1,len(nums)-1

		for l<r{
			n2,n3:=nums[l],nums[r]
			if n1+n2+n3 ==0 {
				res= append(res,[]int{n1,n2,n3})
				for l<r && nums[l]==n2{
					l++
				}
				for l<r && nums[r]==n3{
					r--
				}
			}else  if n1+n2+n3<0{
				l++
			}else {
				r--
			}
		}		
	}
	return res


}

[18].四数之和

题目链接/文章讲解/视频讲解:https://programmercarl.com/0018.%E5%9B%9B%E6%95%B0%E4%B9%8B%E5%92%8C.html

//思路 跟三数之和做法一样 多嵌套一层循环 然后去重

func fourSum(nums []int, target int) [][]int {
	if len(nums)<4{
		return nil
	}
	sort.Ints(nums)
	var res [][]int

	for i := 0; i < len(nums)-3; i++ {
		n1:=nums[i]
		if i>0&&n1==nums[i-1]{
				continue
		}
		
		for j := i+1; j < len(nums)-2; j++ {
			n2:=nums[j]
			if j>i+1&&n2==nums[j-1]{
				continue
			}
		
		l,r:=j+1,len(nums)-1
		for l<r{
			n3,n4:=nums[l],nums[r]
			sum:=n1+n2+n3+n4
			if sum<target {
				l++
				
			}else if sum>target {
				r--
				
			}else{
				res=append(res,[]int{n1,n2,n3,n4})
				for l<r&&n3 == nums[l+1]{
					l++
				}
				for l<r&&n4 == nums[r-1]{
					r--
				}
				l++
				r--
			}
		}
	}
	}
	return res

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值