代码随想录算法训练营第六天| 454.四数相加II,383. 赎金信的交集, 15.三数之和(需要二刷) 18.四数之和(需要二刷)

news2024/9/20 4:00:12

454.四数相加II

暴力超时

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        //超出时间限制
        //分别从4个数组中任选一个,四数相加==0
       int  n = nums4.length,index=0;
       
       int count=0;

       int[] arr1=new int[n*n];
        int[] arr2=new int[n*n];
        int m=arr1.length;
        
        
       //两辆数组先做加法,找出所有可能
       for(int i=0;i<n;i++){
           for(int j=0;j<n;j++){
               arr1[index]=nums1[i]+nums2[j];
               arr2[index]=nums3[i]+nums4[j];
               index++;
           } 
       }
        for(int i=0;i<m;i++){
           for(int j=0;j<m;j++){
               if(arr1[i]+arr2[j]==0){
                   count++;
               }
           }
        }
        return count;



    }
}

卡在这个用例[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

优化,看了下题解用HasMap,思路是差不多的,都是先求两个数组的所有可能元素之和放到map中,然后在map中寻找另外两个数组的所有可能元素之和的相反数

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
       
        //分别从4个数组中任选一个,四数相加==0
        int n=nums1.length;
       int count=0;
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();

       //数组先做加法,找出所有可能的和
       for(int i=0;i<n;i++){
           for(int j=0;j<n;j++){
               map.put(nums1[i]+nums2[j],map.getOrDefault(nums1[i]+nums2[j],0)+1);        
           } 
       }
        for(int i=0;i<n;i++){
           for(int j=0;j<n;j++){
              count+=map.getOrDefault(-nums3[i]-nums4[j],0);//注意这里直接调用get()方法如果找不到会返回null,所有这里用getOrDfault()方法
           }
        }
        return count;
    }
}

383. 赎金信

这道题和242. 有效的字母异位词的思路一样,写的很顺

class Solution {
    public boolean canConstruct(String r, String m) {
        //判断 ransomNote 能不能由 magazine 里面的字符构成。magazine 中的每个字符只能在 ransomNote 中使用一次。
        int[] letter=new int[26];
        for(int i=0;i<r.length();i++){
            letter[r.charAt(i)-'a']++;

        }
        for(int i=0;i<m.length();i++){
            letter[m.charAt(i)-'a']--;
        }
        for(int i=0;i<letter.length;i++){
           if(letter[i]>0){//说明r有字符没有使用到m中的字符
               return false;
           }
        }
        return true;
    }
}

 15.三数之和(需要二刷)

15. 三数之和 

很细节的题目,没有思路

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        //哈希?双指针其实可以理解成是三指针
        int len=nums.length;
        List<List<Integer>> res=new ArrayList<>();
        if(nums == null || len <3){
            return res;
        }
        //排序
        Arrays.sort(nums);
        //遍历数组中的每一个元素
        for(int i=0;i<len;i++){
            //如果遍历的起始元素大于0,那么就直接退出
            //原因,此时数组为有序的数组,最小的数都大于0了,三树枝和肯定大于0
            if(nums[i]>0){
                break;
            }
            //去重,当起始值等于前一个元素时,得到的结果会和前一次相同
            if(i>0&&nums[i]==nums[i-1]){continue;}//这里先i>0避免i=0时这里报错
            int l=i+1;
            int r=len-1;
            //当l不等于r时就继续遍历
            while(l<r){
                //三数相加
                int sum=nums[i]+nums[l]+nums[r];
                //如果等于0,将结果对应的索引位置的值加入结果集中
                if(sum==0){
                    res.add(Arrays.asList(nums[i],nums[l],nums[r]));
                    //在将左指针和右指针移动时,先对做左右指针的值进行判断,如果重复可以跳过
                   //当i不变,如果l取的值和前一个数相同,那么不用计算,直接跳
                    while(l<r&&nums[l]==nums[l+1]){l++;}
                    while(l<r&&nums[r]==nums[r-1]){r--;}
                    l++;r--;
                }
                else if(sum<0){
                    l++;
                }
                else {//sum>0
                    r--;
                }
            }
        }
        return res;
    }
}

两行while代码解决下面示例的情况

 

 18.四数之和(需要二刷)

思路和15.三数之和一样,

只不过四数是要两层for循环,先确定一个sum=nums[i]+nums[k]

再判断sum2=sum+nums[l]+nums[r]是否等于target,

target值是否合法判断:将数组nums升序后,比较target和nums[0]

去重判断:

1.if(i > 0 && nums[i - 1] == nums[i]) {  continue;}
2.if(k>i+1&&nums[k]==nums[k-1]){continue;}//去重
3.while(l<r&&nums[l]==nums[l+1]){l++;}
4.while(l<r&&nums[r]==nums[r-1]){r--;}

代码:

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        //四树之和II给的是4个数组,且索引下标允许相同
        //双指针,和15.三数之和类似
        int len=nums.length;
        List<List<Integer>> res=new ArrayList<>();
        if(nums == null || len <4){
            return res;
        }
        //排序
        Arrays.sort(nums);
       
        for(int i=0;i<len;i++){
            if (nums[i] > 0 && nums[i] > target) { //如果遍历的起始元素大于target,那么就直接退出 //原因,此时数组为有序的数组,最小的数都大于target了,四数之和肯定大于target
                return res;
            }
		
            if (i > 0 && nums[i - 1] == nums[i]) {    // 对nums[i]去重
                continue;
            }
            for(int k=i+1;k<len;k++){
               int sum=nums[i]+nums[k];
           
               //去重,当起始值等于前一个元素时,得到的结果会和前一次相同,在三数之和的target是0
               if(k>i+1&&nums[k]==nums[k-1]){continue;}//去重

               int l=k+1;
               int r=len-1;
            //当l不等于r时就继续遍历
               while(l<r){
                //三数相加
                int sum2=sum+nums[l]+nums[r];
                //如果等于0,将结果对应的索引位置的值加入结果集中
                if(sum2==target){
                    res.add(Arrays.asList(nums[i],nums[k],nums[l],nums[r]));
                    //在将左指针和右指针移动时,先对做左右指针的值进行判断,如果重复可以跳过
                   //当i不变,如果l取的值和前一个数相同,那么不用计算,直接跳
                    while(l<r&&nums[l]==nums[l+1]){l++;}
                    while(l<r&&nums[r]==nums[r-1]){r--;}
                    l++;
                    r--;
                }
                else if(sum2<target){
                    l++;
                }
                else {//sum>0
                    r--;
                }
               }

            }
            
        }
        return res;

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习:训练集与测试集分割train_test_split

1 引言 在使用机器学习训练模型算法的过程中&#xff0c;为提高模型的泛化能力、防止过拟合等目的&#xff0c;需要将整体数据划分为训练集和测试集两部分&#xff0c;训练集用于模型训练&#xff0c;测试集用于模型的验证。此时&#xff0c;使用train_test_split函数可便捷高…

Go语言性能优化建议与pprof性能调优详解——结合博客项目实战

文章目录 性能优化建议Benchmark的使用slice优化预分配内存大内存未释放 map优化字符串处理优化结构体优化atomic包小结 pprof性能调优采集性能数据服务型应用go tool pprof命令项目调优分析修改main.go安装go-wrk命令行交互界面图形化火焰图 性能优化建议 简介&#xff1a; …

python用来做什么的,python用来干什么的

大家好&#xff0c;小编为大家解答python用来干什么的的问题。很多人还不知道python用来做什么的&#xff0c;现在让我们一起来看看吧&#xff01; 编程语言python是用来干什么的&#xff1f; python的作用&#xff1a; 1、系统编程&#xff1a;提供API(ApplicationProgrammin…

【算法提高:动态规划】1.3 背包模型 TODO

文章目录 例题列表423. 采药&#xff08;01背包&#xff09;1024. 装箱问题&#xff08;大小和价值相等的01背包&#xff09;1022. 宠物小精灵之收服&#xff08;二维费用的背包问题&#xff09;补充&#xff1a;相关题目——8. 二维费用的背包问题 278. 数字组合&#xff08;0…

阿里云负载均衡SLB网络型NLB负载均衡架构性能详解

阿里云网络型负载均衡NLB是阿里云推出的新一代四层负载均衡&#xff0c;支持超高性能和自动弹性能力&#xff0c;单实例可以达到1亿并发连接&#xff0c;帮您轻松应对高并发业务。网络型负载均衡NLB具有超强性能、自动弹性伸缩、高可用、TCPSSL卸载、多场景流量分发和丰富的高级…

【初阶C语言】数组

目录 一、一维数组 1.一维数组的创建和初始化 2.一维数组的使用 3.一维数组在内存中的存储 二、二维数组 1.二维数组的创建 2.二维数组的初始化 3.二维数组的使用 4.二维数组在内存中的存储 三、数组的越界问题 四、数组传参 前言&#xff1a; 数组在C语言中是一个…

express学习笔记6 - 用户模块

新建router/user.js const express require(express) const routerexpress.Router() router.get(/login, function(req, res, next) {console.log(/user/login, req.body)res.json({code: 0,msg: 登录成功})})module.exportsrouter 在router/user.js引入并使用 const us…

一起学算法(链表篇)

1.链表的概念 对于顺序存储的结构最大的缺点就是插入和排序的时候需要移动大量的元素&#xff0c;所以链表的出生由此而来 先上代码&#xff1a; // 链表 public class LinkedList<T extends Comparable> {// 结点类class Node {T ele; // 当前结点上的元素内容Node ne…

java学习路程之篇四、进阶知识、石头迷阵游戏、绘制界面、打乱石头方块、移动业务、游戏判定胜利、统计步数、重新游戏

文章目录 1、绘制界面2、打乱石头方块3、移动业务4、游戏判定胜利5、统计步数6、重新游戏7、完整代码 1、绘制界面 2、打乱石头方块 3、移动业务 4、游戏判定胜利 5、统计步数 6、重新游戏 7、完整代码 java之石头迷阵单击游戏、继承、接口、窗体、事件、组件、按钮、图片

【Spring】Spring 中事务的实现

目录 1.编程式事务&#xff08;手动编写代码&#xff09;2.声明式事务&#xff08;利用注解&#xff09;2.1 Transactional作用范围2.2 Transactional参数说明2.3 Transactional工作原理 3.Spring 中设置事务隔离级别3.1 事务四大特性ACID3.2 事务的隔离级别3.2 Spring中设置事…

(13) Qt事件系统(two)

目录 事件分发函数 无边框窗口拖动 自定义事件 发送事件的函数 自定义事件 系统定义的事件号 自定义事件号 自定义事件类 发送和处理事件 sendEvent与postEvent的区别 栈区对象 堆区对象 事件传播机制 事件传播的过程 事件传播到父组件 鼠标单击事件与按钮单击信…

【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析

本章节主要讲解点亮LED的基本原理&#xff0c;以及GPIO框图的讲解。 如何点亮LED&#xff08;输出&#xff09; 首先我们查看原理图&#xff0c;观察电路图中LED的连接情况&#xff0c;如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC&#xf…

30. 利用linprog 解决 生产决策问题(matlab程序)

1.简述 线线规划的几个基本性质&#xff1a;【文献[1]第46页】 (1)线性规划问题的可行域如果非空&#xff0c;则是一个凸集-凸多面体&#xff1b; (2)如果线性规划问题有最优解&#xff0c;那么最优解可在可行域的顶点中确定&#xff1b; (3)如果可行域有界&#xff0c;且可行域…

【数据中台】DataX源码进行二开插件

参考官方 使用的离线数据同步工具/平台&#xff0c;实现不同数据库等各种异构数据源之间高效的数据同步功能 工具部署 https://github.com/alibaba/DataX/blob/master/userGuid.md 拉取下来的代码&#xff0c;pom.xml里面注释 <!--<module>tsdbreader</module&g…

大整数截取解决方法(java代码)

大整数截取解决方法&#xff08;java代码&#xff09; 描述输入描述输出描述输入示例输出示例前置知识&#xff1a;代码 解题思路来自这个博客&#xff1a;简单^不简单 https://blog.csdn.net/younger_china/article/details/126376374 描述 花花有一个很珍贵的数字串&#xf…

P4053 [JSOI2007] 建筑抢修(贪心)(内附封面)

[JSOI2007] 建筑抢修 题目描述 小刚在玩 JSOI 提供的一个称之为“建筑抢修”的电脑游戏&#xff1a;经过了一场激烈的战斗&#xff0c;T 部落消灭了所有 Z 部落的入侵者。但是 T 部落的基地里已经有 N N N 个建筑设施受到了严重的损伤&#xff0c;如果不尽快修复的话&#x…

python项目开发案例集锦,python开发程序流程

大家好&#xff0c;给大家分享一下python项目开发案例集锦 源码&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 今天任务 1.创建Python项目为pythontest1以及test1.py文件 2.修改字号 3.输入九九乘法表程序&#xff0c;编译调试执行 4.配置…

Python selenium对应的浏览器chromedriver版本不一致

1、chrome和chromedriver版本不一致导致的&#xff0c;我们只需要升级下chromedriver的版本即可 浏览器版本查看 //打开google浏览器直接访问&#xff0c;查看浏览器版本 chrome://version/ 查看chromedriver的版本 //查看驱动版本 chromedriver chromedriver下载 可看到浏…

基于 Debian GNU/Linux 12 “书虫 “的Neptune 8.0 “Juna “来了

导读Neptune Linux 发行版背后的团队发布了 Neptune 8.0&#xff0c;作为这个基于 Debian 的 GNU/Linux 发行版的重大更新&#xff0c;它围绕最新的 KDE Plasma 桌面环境构建。 Neptune 8.0 被命名为 “Juna”&#xff0c;是在Neptune 7.5 发布 11 个月后发布的&#xff0c;也是…

2.1 密码学基础

数据参考&#xff1a;CISP官方 目录 密码学基本概念对称密码算法非对称密码算法哈希函数与数字签名公钥基础设施 一、密码学基本概念 1、密码学形成与发展 发展历程 古典密码学 (1949年之前) 主要特点&#xff1a;数据的安全基于算法的保密 近代密码学 (1949~1975年…