代码随想录算法训练营Day5 | 454.四数相加||、383.赎金信、35.三个之和、18.四数之和

LeetCode 454 四数相加 ||

在这里插入图片描述
本题思路

如果使用暴力的话就是 4 层 for 循环,这个时间复杂度就是 O(n^4) 了。

所以我们可以使用 map ,来解决这道题,和之前的两数之和一样,之前是 遍历一个,存进去一个。 如果我们将 nums1 和 nums[2],每一个位置上的和,都存入 map 集合,然后再判断 target - (nums3[i]+nums4[j]) 的值是否存在于 map 中,如果在,就计数器 count = count + map.get(这个值)。 注意:累加的是这个值存在的次数。

下面就利用 示例1 画一个图来更好的理解下这个思路:在这里插入图片描述

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        // 本题思路返回有多少个元素,需要一个计数器 count,碰到符合的条件就 count++
        Map<Integer,Integer> map = new HashMap();
        // 将 nums1 nums2,每个位置都相加 存放到集合 map 中
        for(int i = 0; i < nums1.length; i++){
            for(int j = 0; j < nums2.length; j++){
                map.put(nums1[i] + nums2[j], map.getOrDefault(nums1[i] + nums2[j],0) + 1);
            }
        }
        int count = 0;
        // 利用 0 - (nums3 + nums4) 的值 等于0 的情况,来判断有多个符合条件的四元组
        for(int i = 0; i < nums3.length; i++){
            for(int j = 0; j < nums4.length; j++){
                if(map.containsKey(0 - (nums3[i] + nums4[j]))){
                    count = count + map.get(0 - (nums3[i] + nums4[j]));
                }
            }
        }
        return count;
    }
}

注意点:就是 count 不是 count++;


LeetCode 383 赎金信

在这里插入图片描述
本题思路:判断 ransomNote 是否能由 magazine 组成,说明 magazine 包含 ransomNode,magazine 的范围大一点,所以我们可以很容易想到使用 map , 将 magazine 中的元素全部存入到 map 中,并记录每个元素存在的次数。 然后便利 ransomNode 中的每个元素,判断 magazine 中是否都存在,如果有 一个 不存在就返回 false。如果存在,但是次数已经为 0 ,也返回 false。否则就 次数减 0
下面用一个图来分析下 示例 1,以便更好理解上述思路
在这里插入图片描述

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<Character,Integer> map = new HashMap();
        for(int i = 0; i < magazine.length(); i++){
            map.put(magazine.charAt(i),map.getOrDefault(magazine.charAt(i),0)+1);
        }
        for(int i = 0; i < ransomNote.length(); i++){
            // 如果 magazine 里面没有 ransomNote 或者 这个元素存在此处已经 为 0 ,则返回false
            if( !map.containsKey(ransomNote.charAt(i)) || map.get(ransomNote.charAt(i)) == 0){
                return false;
            }
            map.put(ransomNote.charAt(i),map.get(ransomNote.charAt(i)) -1);
        }
        return true;
    }
}

本题其实用数组的情况下会更好,使用 map 的空间复杂夫会更高于一些(在数量大的时候就能体现出来),因为 map 底层会维护 红黑树 或者 链表等。以下是使用数组的代码。

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;
    }
}

LeetCode 35 三数之和

在这里插入图片描述

注意点:

  1. 要去重,不能出现重复的三元组。所以在每次 i 遍历的时候,都要先进行去重操作
  2. 进行 nums[left] 和 nums[right] 去重的时候,要先保存记录,再进行去重操作。
  3. 对 nums[left] 和 nums[right] 进行去重的时候,一定要保证 left < right (比如 000000 这种情况就会出现下标越界的情况)

本题思路:使用双指针来解决,一个指针 i 从 数组起始位置开始,如果 nums[i] = nums[i-1] ,i 往后走。然后定义一个 left = i + 1, right = nums.length - 1, 判断 nums[i] + nums[left] + nums[right] == 0 , 如果等于 0 就保存这三个数,并且, 在这判断过程中,有可能 nums[left] = nums[left+1], nums[right] = nums[right-1] , 此时 left 也要往后走一个,直到不等为止,right同理往前。

为了方便理解这个思路,利用示例 1:画个图来分析下代码
在这里插入图片描述

  • 循环 i = 0的时候如下图在这里插入图片描述
  • 循环 i = 1的时候在这里插入图片描述
  • 循环 i = 2的时候, 此时由于 nums[2] = nums[1]了,所以需要跳过这一循环
  • 循环 i = 3的时候在这里插入图片描述
  • 循环 i = 4的时候在这里插入图片描述
  • 循环 i = 5的时候不符合条件,结束。
  • 所以最终结果为 【-1,-1,2】【-1,0,-1】
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList();
        for (int i = 0; i < nums.length; i++) {
            // 如果第一个元素就 大于 > 0, 直接返回 res;
            if (nums[i] > 0) {
                return res;
            }
            // 去重 nums[i],这里不能用 nums[i] == nums[i+1] (-1,-1,0)
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int left = i + 1;
            int right = nums.length - 1;
            while (left < right) {
                // 开始判断
                int sum = nums[i] + nums[left] + nums[right];
                if (sum == 0) {
                    List<Integer> list = new ArrayList();
                    list.add(nums[i]);
                    list.add(nums[left]);
                    list.add(nums[right]);
                    res.add(list);
                    // 进行去重 nums[left] 和 nums[right]
                    while (left < right && nums[left] == nums[left + 1]) {
                        left++;
                    }
                    while (left < right && nums[right] == nums[right - 1]) {
                        right--;
                    }
                    left++;
                    right--;
                } else if (sum < 0) {
                    left++;
                } else {
                    right--;
                }
            }

        }
        return res;
    }

LeetCode 18 四数之和

在这里插入图片描述
本题思路: 延用三数之和的思想。在外层 在套 一个 for 循环。用来遍历第一个数字,里面就和 三数之和的逻辑一样了。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        // 思路:和三数之和一样,使用双指针,只不过外面套一层 for 循环
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList();
        for(int k = 0; k < nums.length; k++){
            // 先进行剪枝操作
            if(nums[k] > target && nums[k] > 0){
                break;
            }
            // 进行去重操作
            if( k > 0 && nums[k] == nums[k-1]){
                continue;
            }
            for(int i = k+1; i < nums.length; i++){

                int left = i + 1;
                int right = nums.length - 1;
                // 先进行剪枝操作
                if( nums[k] + nums[i] > target &&  nums[k] + nums[i] > 0 ){
                    break;
                }
                // 进行去重操作
                if( i > k + 1 && nums[i] == nums[i-1]){
                    continue;
                }
                while(left < right){
                int sum = nums[k] + nums[i] + nums[left] + nums[right];
                if(sum < target){
                    left++;
                }else if(sum > target){
                    right--;
                }else{
                    // 相同记录下来
                    List<Integer> list = new ArrayList();
                    list.add(nums[k]);
                    list.add(nums[i]);
                    list.add(nums[left]);
                    list.add(nums[right]);
                    res.add(list);
                    // 开始去重 nums[left] 和 nums[right]
                    while(left < right && nums[left] == nums[left+1]){
                        left++;
                    }
                    while(left < right && nums[right] == nums[right-1]){
                        right--;
                    }                    
                    left++;
                    right--;
                }
                }
            }
        }
        return res;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/259762.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个真正的软件测试从业人员必备技能有哪些?

协同开发能力&#xff1a; 1. 项目管理&#xff08;SVN、Git&#xff09; 2. 数据分析能力&#xff08;Fiddler、Charles、浏览器F12&#xff09;。 接口测试&#xff1a; 1. 概念及接口测试原理概念&#xff08;概念、接口测试原理&#xff09; 2. 接口测试工具&#xff…

AWS向量数据库Amazon OpenSearch Service使用测评

前言 在大模型盛行的当今&#xff0c;选择适宜的数据库显得尤为重要。因为你需要面对海量训练数据&#xff0c;快速的检索至关紧要&#xff0c;以及对于存储的要求也是至关重要的。对于海量的数据查询和存储是需要巨大的算力支持。向量数据库常用在一些图像文本或者视频的生成…

硬件基础集线器、交换机、路由器原理

OSI七层模型 OSI介绍 OSI &#xff08;Open System Interconnect&#xff09;模型全称为开放式通信系统互连参考模型&#xff0c;是国际标准化组织 ( ISO ) 提出的一个试图使各种计算机在世界范围内互连为网络的标准框架 OSI将计算机网络体系结构划分为七层&#xff0c;每一…

【SQL】根据年份,查询每个月的数据量

根据年份&#xff0c;查询每个月的数据量 一种 WITH Months AS (SELECT 1 AS Month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION…

Dokit 开源库:简化 Android 应用开发的利器

Dokit 开源库&#xff1a;简化 Android 应用开发的利器 一、Dokit 简介二、Dokit 功能三、Dokit 使用3.1 DoKit Android 最新版本3.2 DoKit Android 接入步骤 四、总结 在 Android 应用开发过程中&#xff0c;我们经常需要处理调试、性能优化和用户体验等方面的问题。然而&…

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69)

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69) 大家好&#xff0c;小辰今天给大家介绍一个基于协同过滤算法的旅游推荐系统

linux ARM64 处理器内存屏障

一、内存类型&#xff1a; ARMv8架构将系统中所有的内存&#xff0c;按照它们的特性&#xff0c;划分成两种&#xff0c;即普通内存和设备内存。并且它们是互斥的&#xff0c;也就是说系统中的某段内存要么是普通内存&#xff0c;要么是设备内存&#xff0c;不能都是。 1&…

动力电池系统介绍(十四)——热管理系统

动力电池系统介绍&#xff08;十四&#xff09; 一、梗概二、座舱热管理&#xff08;汽车空调&#xff09;2.1 空调制冷2.2 空调制热2.2.1 传统燃油汽车空调制热2.2.2 新能源汽车空调制热 三、动力系统热管理3.1 燃油车发动机热管理3.1.1 冷却系统3.1.2 润滑系统3.1.3 进排气系…

C++ Lambda表达式基础用法

语法 C11标准lambda表达式的语法非常简单&#xff0c;定义如下&#xff0c;并且语法规定lambda表达式如果存在说明符&#xff0c;那么形参列表不能省略。标准还规定能捕获的变量必须是一个自动存储类型。简单来说就是非静态的局部变量、非全局变量。 定义&#xff1a;[ captu…

纳米流体传热与计算机模拟

纳米流体传热与计算机模拟 一、引言 纳米流体传热是一个研究领域&#xff0c;主要关注纳米尺度下流体的传热特性和机制。由于纳米流体的尺寸较小&#xff0c;其传热行为与传统尺度下的流体有很大不同。近年来&#xff0c;随着计算机技术的飞速发展&#xff0c;计算机模拟成为…

TensorFlow(2):Windows安装TensorFlow

1 安装python环境 这一步请自行安装&#xff0c;这边不做介绍。 2 安装anaconda 下载路径&#xff1a;Index of /&#xff0c;用户自行选择自己的需要的版本。 3 环境配置 3.1 anaconda环境配置 找到设置&#xff0c;点击系统->系统信息->高级系统设置->环境变量…

Github 2023-12-19开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-19统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4Rust项目2非开发语言项目2C#项目1TypeScript项目1 Avalonia: 跨平台UI框架和Avalonia XPF 创建周…

高高。。。。

重点&#xff1a;存储系统/分布式系统 得到数据&#xff1a; 数据模型计算&#xff08;简单系统&#xff09;实现一个操作系统CPU&#xff08;成本高&#xff09;仿真实验 文章类型&#xff1a; 国际会议 10-15slices期刊论文 做OS研究为其他方面提供支持 一 Advanced OS …

鸿蒙开发运用ArkUI基础-实操显式动画

利用ArkUI组件不仅可以实现属性变化引起的属性动画&#xff0c;也可以实现父组件状态变化引起子组件产生动画效果&#xff0c;这种动画为显式动画。效果如图所示&#xff1a; 代码结构解读 ├──entry/src/main/ets // 代码区 │ ├──common │ │ └──…

css 美化滚动条

当div内容溢出容器定义的高度时,滚动条显示,并美化默认的滚动条样式 div 容器 <divclass"content">内容 </div>css 样式 /* 问话区域 滚动条 */ .content {overflow: auto;height: 662px;padding: 25px;scrollbar-width: thin; /* 设置滚动条宽度 */bo…

四川云汇优想教育咨询有限公司电商服务靠谱吗

随着抖音电商的兴起&#xff0c;越来越多的商家开始关注这一领域。四川云汇优想教育咨询有限公司作为一家专注于电商服务的企业&#xff0c;也受到了广泛的关注。那么&#xff0c;四川云汇优想教育咨询有限公司的抖音电商服务靠谱吗&#xff1f;下面我们将从多个方面进行深入剖…

大模型赋能“AI+电商”,景联文科技提供高质量电商场景数据

据新闻报道&#xff0c;阿里巴巴旗下淘天集团和国际数字商业集团都已建立完整的AI团队。 淘天集团已经推出模特图智能生成、官方客服机器人、万相台无界版等AI工具&#xff0c;训练出了自己的大模型产品 “星辰”&#xff1b; 阿里国际商业集团已成立AI Business&#xff0c;…

在线教育(内部)培训系统搭建,提供高效便捷的学习体验

我国一直是教育大国&#xff0c;不管是国民义务教育&#xff0c;还是学历提升、职业证书等&#xff0c;我国教育行业一直处于兴盛不衰的地步。 随着互联网信息化的发展&#xff0c;在线教育培训系统逐渐在教育行业得到重视。根据数据显示&#xff0c;我国在线教育市场规模将达…

拼图游戏

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import jav…

探索泰勒级数在机器学习中的作用:从函数逼近到模型优化

一、介绍 泰勒级数是数学中的一个基本概念&#xff0c;在机器学习领域有着重要的应用。本文将探讨泰勒级数的基础知识、它在机器学习中的相关性以及一些具体应用。 揭开复杂性&#xff1a;利用泰勒级数增强机器学习应用的理解和效率。 二、理解泰勒级数 在数学中&#xff0c;泰…
最新文章