首页 > 其他分享 >day6

day6

时间:2024-05-30 21:56:29浏览次数:9  
标签:count return nums day6 List int left

今天是day6:
1 四数相加:给定四个整数数组,长度都为n,计算有多少个元组满足四数字相加为0:

func fourSumCount(nums1 []int,nums2 []int,nums3 []int,nums4 []int) int {
    //make创造一个map,键值对都为int
    m:=make(map[int]int)
    count:=0
    // 双层嵌套两值相加统计次数
    for _,v1 := range nums1{
        for _,v2:= range nums2{
            m[v1 + v2]++
        }
    }
    //两层嵌套接着满足加起来为0
    for _,v3 := range nums3{
        for _,v4:= range nums4 {
            count += m[-v3-v4]
        } 
    }
    return count
}
class Solution:
    def fourSumCount(self,nums1:List[int],nums2:List[int],nums3:List[int],nums4:List[int]) -> int {
        hashmap = dict()
        for n1 in nums1:
            for n2 in nums2:
                hashmap[n1+n2] = hashmap.get(n1+n2,0) +1
        count = 0
        for n3 in nums3:
            for n4 in nums4:
                key = -n3-n4
                if key in hashmap:
                    count += hashmap[key]
        
        return count
    }
from collections import defaultdict
class Solution:
    def fourSumCount(self,nums1:List[int],nums2:List[int],nums3:List[int],nums4:List[int]) -> int{
        rec,cnt = defaultdict(lambda:0),0
        for i in nums1:
            for j in nums2:
                rec[i+j] += 1
        
        for i in nums3:
            for j in nums4:
                cnt+= rec.get(-(i+j),0)
        return cnt
    }

2 赎金信:判断两个单词的字母组成是否相同:

func canConstruct(ransomNate string,magazine string) bool {
    record:= make([]int,26)
    for _,v:= range magazine{
        record[ v - 'a']++
    }
    for _,v := range ransomNote{
        record[v - 'a']--
        if record[v - 'a'] < 0{
            return false
        }
    }
    return true
}
class Solution:
    def canConstruct(self,ransomNote:str,magazine:str) -> bool:
        counts = {}
        for c in magazine:
            counts[c] = counts.get(c,0) +1
        for c in ransomNote:
            if c not in counts or counts[c] == 0:
                return False
            counts[c] == -1
        return True
class Solution:
    def canConstruct(Self,ransomnote:str,magazine:str) -> bool {
        ransom_count = [0] * 26
        magazine_count = [0] * 26
        for c in ransomNote:
            ransom_count[ord(c) - ord('a')] +=1
        for c in magazine:
            magazine_count[ord(c) - ord('a')] +=1
        return all(ransom_count[i] <= magazine_count[i] for i in range(26))
    }

3 三数之和:返回三数字相加为0

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
}
class Solution:
    def threeSum(self,nums:List[int]) ->List[List[int]]:
        result = []
        nums.sort()

        for i in range(len(nums)):
            if nums[i] > 0:
                return result
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            left = i+1
            right = len(nums) - 1
            while right > left:
                sum_ = nums[i] + nums[left] + nums[right]
                if sum_ < 0:
                    left+=1
                elif sum_ > 0:
                    right -=1
                else:
                    result.append([nums[i],nums[left,nums[right]]])
                    while right > left and nums[right] == nums[right - 1]:
                        right -=1
                    while right > left and nums[left] == nums[left+1]:
                        left+=1
                    right -=1
                    left +=1
        return result

四数之和:四个数字相加为0

func fourSum(nums []int, target int) [][]int {
    //先排除条件不符合即长度小于四的
    if len(nums) <4{
        return nil
    }
    //先将数组整体整数化切片后再升序排序
    sort.Int(nums)
    var res[][]int
    //此处也是为了找出四个元素而遍历
    for i:=0;i< len(nums) - 3;i++{
        n1 := nums[i]
        //此时重复,跳出当前for循环直接开始下一次for循环
        if i > 0 && n1 == nums[i -1]{
            continue
        }
        //在第一个for循环的基础上嵌套第二个for则是为了找第二个不重复值
        for j:=0;j<len(nums) - 2;j++{
            n2:=nums[j]
            //逻辑同上
            if j > i+1 && n2 == nums[j-1]{
                continue
            }
            //此时前两个数字应该是已经找到了,所以用双指针法来找剩余的两个
            l:=j+1
            r:=len(nums) -1
            for l < r {
                n3:=nums[l]
                n4:=nums[r]
                sum:=n1+n2+n3+n4
                //这个逻辑用来不断调整位置最终使得sum=target
                if sum < target {
                    l++
                }else if sum > target{
                    r--
                }else{
                    //此时,把n1,n2,n3,n4追加至res中
                    res = append(res,[]int{n1,n2,n3,n4})
                    //此时仍要去重
                    for l < r && n3 == nums[l+1] {
                        l++
                    }
                    for l < r && n4 == nums[r-1]{
                        r--
                    }
                    r--
                    l++
                }
            }
        }
    }
    return res
}
class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        n = len(nums)
        result = []
        for i in range(n):
            if nums[i] > target and nums[i] > 0 and target >0:
                break
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            for j in range(i+1,n):
                if nums[i] + nums[j] >target and target > 0:
                    break
                if j > i+1 and nums[j] == nums[j-1]:
                    continue
                left,right = j+1,n-1
                while left <right:
                    s = nums[i] +nums[j] +nums[left]+nums[right]
                    if s == target:
                        result.append([nums[i],nums[j],nums[left],nums[right]])
                        while left < right and nums[left] == nums[left+1]:
                            left+=1
                        while left <right and nums[right] == nums[right-1]:
                            right-=1
                        left+=1
                        right-=1
                    elif s <target:
                        left+=1
                    else:
                        right-=1
        return result

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        //空字典与遍历nums的值并将其加入至freq中
        freq = {}
        for num in nums:
            freq[num] = freq.get(num,0) + 1
        //声明一个空集合set
        ans = set()
        //三层内嵌for直接去重
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                for k in range(j+1,len(nums)):
                    //这里直接用val等于三者和与target之差,判断其是否在已有的nums字典中
                    val = target - (nums[i] + nums[j] + nums[k])
                    //如果在,那么统计三层嵌套中分别存在的等于val的个数,val就是我们要找的剩下的一个数
                    if val in freq:
                        count = (nums[i] == val) + (nums[j] == val) + (nums[k] == val)
                        //将排序后的一组元素转换为元组,并将该元组添加到 ans 集合
                        if freq[val] > count:
                            ans.add(tuple(sorted([nums[i],nums[j],nums[k],val])))
        return [list(x) for x in ans]

标签:count,return,nums,day6,List,int,left
From: https://www.cnblogs.com/leisure535/p/18223305

相关文章

  • 代码随想录算法训练营day6(哈希表)
    代码随想录算法训练营day6(哈希表):学习内容:哈希表基础内容:哈希表定义:哈希表是根据关键码的值而直接进行访问的数据结构目的:一般哈希表都是用来快速判断一个元素是否出现集合里。哈希函数定义:通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据......
  • 敏捷冲刺day6--数字工匠队
    这个作业属于哪个课程软件工程这个作业的要求是什么项目冲刺这个作业的目标冲刺日志6站立式会议照片工作困难要讨论哪一种界面效果合适昨日完成工作界面优化今日计划工作完善任务的删除编辑项目燃尽图每日总结陆靖:冲刺快结束了()简浩辉:倒数第二天......
  • m1_day6
    课程内容:Java中的数组数组的复制Java中的数组什么是数组一组数据数组可以理解成一个容器用来存储多个类型相同的元素数组优势:将一组零散的数据统一管理数组的基本用法创建数组对象:int[]data=newint[5];//空间大小int[]data=newint[]{元素,元......
  • JAVA语言学习-Day6
    程序、进程、线程程序:指令与数据的有序集合,静态概念进程:执行程序的一次执行过程,动态概念。是系统分配资源的单位线程:一个进程中至少包含一个线程,通常一个进程中有若干个线程。线程是cpu调度和执行的单位线程的创建继承thread类实现runnable接口实现callable接口线......
  • 代码随想录 day6 哈希表
    题目:P242有效的字母异位数,P349两个数组的交集,P202快乐数,P1两数之和收获:1.使用数组,集合(set,主要是unorder_set,无序,无重复)做哈希表。哈希表一般用来快速判断一个元素是否出现在集合里。2.unorder_set的用法。classSolution{public:vector<int>intersection(vector<......
  • PHP代码审计——Day6-Frost Pattern
    漏洞解析classTokenStorage{publicfunctionperformAction($action,$data){switch($action){case'create':$this->createToken($data);break;case'delete':......
  • 【每日C语言】Day6——变量与操作符
    目录2.4变量4.1变量的创建4.2 变量的分类2.5算术操作符:+、-、*、/、%5.1+和-5.2 *5.3 /5.4%2.6赋值操作符:=和复合赋值6.1 连续赋值6.2复合赋值符2.7单目操作符:++、--、+、-7.1++和--7.1.1 前置++ 7.1.2 后置++7.1.3 前置--7.1.4 后置--7.2+和......
  • 代码随想录打卡Day6
    字符串344.反转字符串classSolution{publicvoidreverseString(char[]s){//注意遍历范围,可以减少循环次数for(inti=0;i<s.length/2;i++){chartmp=s[i];s[i]=s[s.length-i-1];s[s.length-i-1]=t......
  • 就业班 第二阶段 2401--3.26 day6 Shell初识 连接vscode
    远程连接vs_code可能出现的问题C:\Users\41703\.ssh验证远程主机的身份,如果连不上vscode,可以尝试删除这里面的公钥代码。重新安装那个扩展,排除扩展本身的问题谁连过我,并操作了什么curlhttps://gitea.beyourself.org.cn/newrain001/shell-project/raw/branch/master......
  • day6?
    星期六教了分配律带了吃的必须举很简单的例子才好往后面走。下午还好没有出去,大太阳出太阳雨。然后下午玩了下,准备去帮忙做烤肠,终于下定决心买了组装台式,拭目以待,第二天还要去面谈,好紧张,也没啥。4个人,6分钟。排队抽签本身不是最后291/330抽完签变成了4-49我真的会......