代码随想录算法训练营第七天
三级目录
[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
}