当前位置: 首页 > article >正文

2025-2-5算法打卡

一,454. 四数相加 II

1.题目描述:

给你四个整数数组 nums1nums2nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

2.实例:

示例 1:

输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:
两个元组如下:
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0

示例 2:

输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1

3.思路:

  1. 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
  2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
  3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
  4. 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  5. 最后返回统计值 count 就可以了

4:代码:

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int res = 0;
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        //统计两个数组中的元素之和,同时统计出现的次数,放入map
        for (int i : nums1) {
            for (int j : nums2) {
                int sum = i + j;
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
        }
        //统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数
        for (int i : nums3) {
            for (int j : nums4) {
                res += map.getOrDefault(0 - i - j, 0);
            }
        }
        return res;
    }
}

二,383. 赎金信

1.题目描述:

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

2.实例:

示例 1:

输入:ransomNote = "a", magazine = "b"
输出:false

示例 2:

输入:ransomNote = "aa", magazine = "ab"
输出:false

示例 3:

输入:ransomNote = "aa", magazine = "aab"
输出:true

3.思路:

因为题目说只有小写字母,那可以采用空间换取时间的哈希策略,用一个长度为26的数组来记录magazine里字母出现的次数。

然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。

4:代码:

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // shortcut
        if (ransomNote.length() > magazine.length()) {
            return false;
        }
        // 定义一个哈希映射数组
        int[] record = new int[26];

        // 遍历
        for(char c : magazine.toCharArray()){
            record[c - 'a'] += 1;
        }

        for(char c : ransomNote.toCharArray()){
            record[c - 'a'] -= 1;
        }
        
        // 如果数组中存在负数,说明ransomNote字符串中存在magazine中没有的字符
        for(int i : record){
            if(i < 0){
                return false;
            }
        }

        return true;
    }
}


http://www.kler.cn/a/535549.html

相关文章:

  • 在 MySQL 8 中配置主从同步(主从复制)是一个常见的需求,用于实现数据的冗余备份、读写分离等。
  • 区块链项目孵化与包装设计:从概念到市场的全流程指南
  • 前端控制器模式
  • ZK-ALU-在有限域上实现左移
  • go数据结构学习笔记
  • 机器学习之数学基础:线性代数、微积分、概率论 | PyTorch 深度学习实战
  • 文件基础IO
  • SRS分析及低延迟实现机制
  • Mac 部署Ollama + OpenWebUI完全指南
  • Linux 内核模块 | 加载 / 添加 / 删除 / 优先级
  • Python aiortc API
  • Redis单线程架构
  • Redis - 全局ID生成器 RedisIdWorker
  • TypeScript+React+Redux:类型安全的状态管理最佳实践
  • MySQL知识大总结(进阶)
  • 如何开设一个Facebook账户:详细步骤与注意事项
  • 人工智能丨利用人工智能与自动化实现高效运营推广
  • 十. Redis 事务和 “锁机制”——> 并发秒杀处理的详细说明
  • python爬虫常用库
  • 深入浅出 NVM:如何管理 Node 版本?
  • 8.[网鼎杯 2020 青龙组]AreUSerialz
  • DeepSeek技术报告解析:为什么DeepSeek-R1 可以用低成本训练出高效的模型
  • Beans模块之工厂模块注解模块InitDestroyAnnotationBeanPostProcessor
  • PostgreSQL存储过程和执行
  • 【工具篇】深度揭秘 Midjourney:开启 AI 图像创作新时代
  • 备战蓝桥杯-洛谷