54三数之和55 56有无重复元素的全排列

news/2024/5/2 7:23:36/文章来源:https://blog.csdn.net/Sophia2333333331/article/details/128410450

54 三数之和

在这里插入图片描述
首先想到的就是之前的两数之和,只要在外层遍历一遍,对每个元素用之前的两数之和的哈希做法,就刚好是O(n^2)
但是有坑的地方在于需要去重,并且输出的三元组也是需要顺序的!!然后我用set去重和重写比较器花了较多时间

import java.util.*;
public class Solution {public ArrayList<ArrayList<Integer>> threeSum(int[] num) {//固定一个之后就是两数之和ArrayList<ArrayList<Integer>>res = new ArrayList<ArrayList<Integer>>();Set<ArrayList<Integer>> s = new HashSet<ArrayList<Integer>>();for(int i=0;i<num.length;i++){Map<Integer,Integer> p = new HashMap<>();  int sum=-1*num[i];for(int j=i+1;j<num.length;j++){if(p.containsKey(num[j])){ArrayList<Integer> row = new ArrayList<Integer>();row.add(num[i]);row.add(sum-num[j]);row.add(num[j]);row.sort((a,b)->a-b);                   s.add(row);                  }if(!p.containsKey(sum-num[j])){p.put(sum-num[j],j);}       }}//用set去重for(Iterator<ArrayList<Integer>> i=s.iterator();i.hasNext();){res.add(i.next());}//三元组也要排序输出Collections.sort(res,new Comparator<ArrayList<Integer>>(){@Overridepublic int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {for(int i=0;i<3;i++){if(o1.get(i)!=o2.get(i))return o1.get(i)-o2.get(i);}return 0;}}); return res;      }
}

学到的:set的遍历:

for(Iterator<ArrayList<Integer>> i=s.iterator();i.hasNext();){res.add(i.next());
}

比较器的自定义:

Collections.sort(res,new Comparator<ArrayList<Integer>>(){@Overridepublic int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {for(int i=0;i<3;i++){if(o1.get(i)!=o2.get(i))return o1.get(i)-o2.get(i);}return 0;}}); 

注意这里是直接返回 o1.get(i)-o2.get(i);,如果是降序排列就是 o2.get(i)-o1.get(i);!!!compare的返回值如果为负数,表示不用交换o1和o2,如果为正再交换。不用if判断!!!

55没有重复项数字的全排列

在这里插入图片描述
这道题知道要递归也不知道怎么写,一开始看了很久的题解还是没理解,最后还是看了深搜的回溯算法才最终理解:
在这里插入图片描述
比如我现在要往3个盒子里填3个数字,全排列的话,用dfs,参数index表示我当前要添入的盒子的下标(0,1,2)

递归需要边界条件和当前处理逻辑:
边界条件:已经全部填完,当前索引==num.size
当前逻辑:遍历所有元素,如果还没放到盒子中,就放入,递归到放index+1个空盒子
最重点在于回溯:满了之后就从末尾撤回一个,才能尝试其他可能

import java.util.*;public class Solution {ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();ArrayList<Integer> list = new ArrayList<Integer>();public ArrayList<ArrayList<Integer>> permute(int[] num) {dfs(num,0);return res;}public void dfs(int[] num,int index){//递归结束条件if(index==num.length){res.add(new ArrayList<Integer>(list));//重点!!return;} //递归执行for(int i=0;i<num.length;i++){//遍历所有元素 不是从i=index开始if(list.contains(num[i])) continue;list.add(num[i]);dfs(num,index+1);//回溯:撤销末尾的list.remove(list.size()-1);//注意不是remove(num[i])}}
}

除了算法,用java实现也有几个要注意的地方:

1.res.add(new ArrayList(list));//添加进res的时候要复制一个新list,否则直接res.add(list),始终是同一个list对象,后面的list的各种操作还会体现到res里,这显然不是我们要的!!

时间复杂度:O(n∗n!)O(n*n!)O(n∗n!),n个元素的数组进行全排列的递归,每次递归都要遍历数组
空间复杂度:O(n)O(n)O(n),递归栈的最大深度为数组长度n,res属于返回必要空间

55有重复项数字的全排列

在这里插入图片描述
思想和上题一样,只是多存了一个count数组记录每个元素对应的个数

import java.util.*;public class Solution {int[] count = new int[8];//存-1 5对应数字个数 -1 5映射到index 1 7 全局默认初始化为0ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();ArrayList<Integer> list = new ArrayList<Integer>();//去掉重复的HashSet<ArrayList<Integer>> set = new HashSet<ArrayList<Integer>>();public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {for(int i=0;i<num.length;i++) count[num[i]+2]++;dfs(num,0);for(Iterator<ArrayList<Integer>> it=set.iterator();it.hasNext();){res.add(it.next());}//字典序排列输出Collections.sort(res,new Comparator<ArrayList<Integer>>(){@Overridepublic int compare(ArrayList<Integer> a, ArrayList<Integer> b){for(int i=0;i<a.size();i++){if(a.get(i)!=b.get(i)) return a.get(i)-b.get(i);}return 0;}});return res;}public void dfs(int[] num, int index){if(index==num.length){set.add(new ArrayList<Integer>(list));return;}for(int i=0;i<num.length;i++){if(count[num[i]+2]>0){list.add(num[i]);count[num[i]+2]--;dfs(num,index+1);list.remove(list.size()-1);count[num[i]+2]++;}}}
}

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

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

相关文章

史上最强,这份在各大平台获百万推荐的Java核心手册实至名归

又逢“金九银十”&#xff0c;年轻的毕业生们满怀希望与忐忑&#xff0c;去寻找、竞争一个工作机会。已经在职的开发同学&#xff0c;也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而&#xff0c;面试人群众多&#xff0c;技术市场却相对冷淡&#xff0c;…

flutter 环境搭建

一、简介 Flutter 是谷歌开发的一款开源、免费的&#xff0c;基于 Dart 语言的U1框架,可以快速在i0S和Android上构建高质量的原生应用。 它最大的特点就是跨平台和高性能。Dart是由谷歌&#xff0c;在2011 年开发的计算机编程语言&#xff0c;它可以被用于Web、服务器、移动应…

服务注册配置中心Nacos

文章目录一. 前言二. 下载安装1. 下载安装包2. Windows环境安装3. Linux环境安装1. 单击模式启动2. 集群模式启动3. 远程web控制4. 注册为系统服务三. 基本使用1. 添加依赖2. 服务注册3. 配置实例集群属性4. 实例权重负载均衡5. 环境隔离6. 临时实例与非临时实例四. Nacos配置管…

python常用模块

time模块 常用操作 1.直接获取时间 time.time() #获取结果是秒数&#xff0c;即从1970年1月1日8:00起计#1671856010.9592516 2.获取结构化时间 time.localtime() #获取本地时间&#xff0c;中国为东八区&#xff0c;为上海时间 time.gmtime() …

3.2 Static Terrestrial Laser Scanners 静态地基激光扫描仪

本章节介绍的静态地基激光扫描系统指的是那些在一个固定位置的位置上对周边场景地物特征进行扫描的设备。该类型设备的扫描测量机制是&#xff0c;通过激光测距仪进行斜距测量&#xff0c;与此同时通过水平和竖直两个方向上同步运动的角度编码器来记录角度变化值&#xff08;如…

C#大型医院HIS系统源码 医院信息管理系统源码 C/S架构 VS2013+sql2012

了解更多源码内容&#xff0c;可私信我。 开发环境&#xff1a;VS2013sql2012 C/S架构 一、门诊系统&#xff1a; 1、挂号与预约系统:实现了医院门诊部挂号处所需的各种功能&#xff0c;包括门诊安排的管理&#xff0c;号表的生成及维护&#xff0c;门诊预约管理和挂号处理&…

一文带你深入理解【Java基础】· 网络编程(下)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

AQS学习

1.1 AQS 简单介绍 AQS 的全称为&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff0c;这个类在 java.util.concurrent.locks 包下面。 AQS 是一个用来构建锁和同步器的框架&#xff0c;使用 AQS 能简单且高效地构造出应用广泛的大量的同步器&#xff0c; 比如我们提…

五、Arduino IDE开发esp8266环境搭建

1、安装驱动程序 (1)安装USB转串口驱动程序。 (2)根据板载的USB转串口驱动芯片选择合适驱动安装。USB转串口芯片负责和电脑之间进行数据通信。 (3)常见USB转串口驱动 CP210x驱动:CP210x USB 至 UART 桥 VCP 驱动器 - 芯科科技 CH340驱动 2、Arduino IDE环境搭建 要想使用Ar…

K8S-存储-Volume

问题 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃 时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重新启动。…

【kafka】学习笔记(三)

学习笔记七、Kafka-Eagle 监控7.1 环境准备7.2 Eagle 安装7.3、修改配置文件7.4、添加环境变量7.5、启动Eagle八、Kafka-Kraft 模式8.1、Kafka-Kraft 集群部署8.2、初始化集群数据目录8.3、启动 kafka 集群8.4、测试8.5、集群启动脚本九、SpringBoot集成Kafka七、Kafka-Eagle 监…

支持设备的待机唤醒功能

系统待机唤醒功能 1 说明背景 1.1 需求 支持 GPU 进入低功耗模式&#xff0c;让用户选择降低设备的功耗 1.2 概念 上位词&#xff1a;APM, ACPI 同类词&#xff1a;睡眠模式, S0~S5 下位词&#xff1a;系统挂起, 系统唤醒, 运行时设备电源管理 1&#xff09;ACPI 在计算机…

第10章_索引优化与查询优化

第10章_索引优化与查询优化 都有哪些维度可以进行数据库调优?简言之: 索引失效、没有充分利用到索引——索引建立关联查询太多JOIN (设计缺陷或不得已的需求)——SQL优化服务器调优及各个参数设置(缓冲、线程数等)———调整my.cnf。数据过多――分库分表 关于数据库调优的…

net/http 库的客户端实现(下)

前言 上一篇文章我们讲了 net/http 库客户端 request 的构建&#xff0c;接下来继续讲构建HTTP请求之后的处理操作 net/http 库的客户端实现(上) net/http 库的客户端实现(下) net/http 库的服务端实现 启动事务 构建 HTTP 请求后&#xff0c;接着需要开启HTTP事务进行请…

Python——几个常用的数学函数

1. min()函数&#xff1a;取出给定参数的最小值 说明&#xff1a;获取指定数值或者指定序列中最小值。 print(min(1, 5)) print(min(1, 2, 3, 4, 5, 6)) print(min([2, 3, 4, 5])) 2.max()函数&#xff1a;取出给定参数的最大值 说明&#xff1a;获取指定数值或者指定序列中…

XDocReport使用入门

XDocReport 简介 XDocReport是GitHub上根据麻省理工学院许可证开源的Wrod导出框架。XDocReport可以根据ODT、Doc、Docx文档模板通过模板引擎语法&#xff08;Freemarker、Velocity&#xff09;转换为另外一种格式文档&#xff08;Doc、Docx、XHTML、PDF&#xff09;。 XDocR…

前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

文章目录6. 控制台打印&#xff08;Console&#xff09;模拟Java日志打印格式美化对象打印&#xff08;表格形式打印输出&#xff09;日志等级输出&#xff08;让其在控制台显示时有颜色提示&#xff09;代码运行时间统计打印输出6. 控制台打印&#xff08;Console&#xff09;…

用树莓派4B安装gitlab,亲测可用~

最近成功在CentOS7上安装了gitlab&#xff0c;忽然想到是不是可以把吃灰的树莓派4B也装上gitlab&#xff0c;于是研究了一下&#xff0c;做个分享。 树莓派是4B 8G版本。本身装的是官方的64位系统。之前可能还装过一些乱七八糟的东西&#xff0c;这里就不提了。 上gitlab官网…

移动 IP(计算机网络-网络层)

目录 移动性对网络应用的影响 移动IP中数据报的转发过程 移动IP中数据报的转发过程 三角路由的低效性 解决三角路由的低效性 移动IP的标准 移动性对网络应用的影响 现在先考虑这样一种情况&#xff0c;一个用户拿着无线移动设备在一个Wi-Fi服务区内走动&#xff0c;并且边…

【python圣诞树的实现】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…