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

news2024/11/19 8:45:11

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>>(){
            @Override
            public 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>>(){
	  @Override
	  public 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 全局默认初始化为0
    ArrayList<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>>(){
            @Override
            public 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.coloradmin.cn/o/112567.html

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

相关文章

c语言复习之预编译(十四)

1.以#开头的行&#xff0c;都称为编译器指令 #define定义宏#if #else #elif #endif条件编译#ifdef #ifndef判断是否定义了某个宏#error错误#program设定状态或指定完成&#xff08;编译器&#xff09;#undef取消宏定义 2.预定义宏 __LINE__行号__FILE__源文件名__DATE__创建…

你以为架构师天天就画图写PPT吗,告诉你其他事儿多了去了~

V-xin&#xff1a;ruyuan0330 获得600页原创精品文章汇总PDF 目录 一、多系统订阅数据回顾二、核心数据的监控系统三、电商库存数据如何监控四、数据计算链路追踪五、百亿流量下的数据链路追踪六、自动化数据链路分析七、下篇预告 上篇文章《为什么我建议线上高并发量的代码&a…

rip综合实验

目录 1.拓扑图 2.要求 3.要求分析 4.主要配置 5.测试 6.实验总结 1.拓扑图 2.要求 R1代表运营商&#xff0c;R1远程登录R2实际登录R9R3访问R7的环回&#xff0c;实际走下面全网可达 3.要求分析 将R2包括右边所有设备理解为一个局域网&#xff0c;在R2的出接口上配置NAT…

BIT.3_Linux进程概念

目录冯诺依曼体系结构操作系统(Operator System)概念设计OS的目的定位如何理解 "管理"总结系统调用和库函数概念进程概念知识点基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类组织进程查看进程通过系统调用获取进程标示符通过系统调用创建进程-fork…

上次面试跪在了Redis上,刷完腾讯云大神亲码的“redis深度笔记”,终面进腾讯!

前言 作为这个时代码代码的秃头人员&#xff0c;对Redis肯定是不陌生的&#xff0c;如果连Redis都没用过&#xff0c;还真不好意思出去面试&#xff0c;指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis&#xff0c;像亚马逊、谷歌、阿里、腾讯都要使…

使用PicGo+阿里云OSS实现md文档图片上传

使用PicGo阿里云OSS实现md文档图片上传 这次给大家带来的是PicG0阿里云Osstypora的图床环境搭建&#xff0c;帮助大家提高工作效率写博客速度&#xff01; 1.typora安装 给大家一个链接&#xff1a;typora&#xff0c;打开后点击下载就行&#xff0c;正式版收费&#xff0c;…

Qt扫盲-QTextBrowser理论总结

QTextBrowser理论总结1. 简述2. 文档来源和内容3. 导航4. 用途1. 简述 QTextBrowser 顾名思义其实就是一个文本阅读器&#xff0c;但是这个类类扩展了 QTextEdit 的只读模式功能&#xff0c;当然了 QTextEdit 其实也就是QTextBrowser 的父类。添加的功能主要是一些导航 naviga…

对路由的基本理解和使用

一、认识路由 1、生活中的路由器 构造&#xff1a;路由器上有多个网线接口&#xff0c;每一个接口都对应一台设备 功能&#xff1a;多台设备能同时上网 2、编程中的路由和路由器 &#xff08;1&#xff09;后端渲染和后端路由 ①概念 早期的网站开发整个HTML页面是由服务器…

【附源码】如何C语言打印出心形表白?

使用C语言实现打印出心形&#xff0c;初学者的表白神器~ 我们分了4部分&#xff0c;前3行一部分&#xff0c;4-6行一部分&#xff0c;7-13行一部分&#xff0c;最后一行一部分&#xff0c;读者请仔细阅读注释&#xff0c;已经写的很详细了。 前三行输出&#xff0c;为了让初学…

6.1 文本情感倾向性分析

文章目录一、自然语言情感分析1.1 使用深度神经网络完成情感分析任务1.2 处理变长数据1.3 学习句子的语义二、循环神经网络RNN和长短时记忆网络LSTM2.1 RNN和LSTM网络的设计思考2.2 RNN网络结构2.3 LSTM网络结构2.4 使用LSTM完成情感分析任务三、使用飞桨实现基于LSTM的情感分析…

Python pandas有好几百个库函数,你都用过吗(4)

上一篇链接&#xff1a; https://blog.csdn.net/boysoft2002/article/details/128428569 S~W&#xff1a; Function46~56 Types[Function][45:] [set_eng_float_format, show_versions, test, timedelta_range, to_datetime, to_numeric, to_pickle, to_timedelta, unique,…

技术分享 Oracle下启用块跟踪

创建存放块跟踪文件目录 [oraclehost01 ~]$ cd /u01/app [oraclehost01 app]$ mkdir BCT 启用块跟踪 SQL> alter database enable block change tracking using file /u01/app/BCT/rman.bct; 检查块跟踪状态 SQL> col filename for a22 SQL> select filename, status,…

linux中级——libcurl库访问百度

libcurl简介: 在linux底下用c语言做http编程方法&#xff0c;依赖libcurl。 libcurl是一个跨平台的网络协议库&#xff0c;支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权&#xff0c;HTTP POST, HTTP PUT, FTP 上传, HTTP基…

1549:最大数——线段树

【题目描述】 原题来自&#xff1a;JSOI 2008 给定一个正整数数列 a1,a2,a3,⋯,an &#xff0c;每一个数都在 0∼p–1 之间。可以对这列数进行两种操作&#xff1a; 添加操作&#xff1a;向序列后添加一个数&#xff0c;序列长度变成 n1&#xff1b; 询问操作&#xff1a;询…

数据库系统概论笔记

数据库系统概论(王珊 萨师煊 编著)笔记。 第一章 绪论 1.数据库系统概述 1.1数据库的4个基本概念 数据&#xff1a;描述事物的符号记录称为数据。数据的含义称为数据的语义&#xff0c;数据与其语义是不可分的。数据库&#xff1a;长期存储在计算机内、有组织的、可共享的大…

fpga实操训练(仿真和状态机)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在进行fpga上板子实验之前&#xff0c;相信很多同学都是通过仿真的方式来实现verilog学习的。仿真比较容易&#xff0c;也不需要依赖物理硬件&…

offsetTop、clientTop、scrollTop等属性详解【概念+详细例子分析】

文章目录一、 offsetscrollclient详细讲解1-1 offset系列1-2 client系列1-3 scroll系列二、 一张图片即可理解一、 offsetscrollclient详细讲解 1-1 offset系列 MDN中offset… offsetWidth/offsetHeight :对象的可见宽度offsetLeft/offsetTop&#xff1a; 当前元素距浏览器边界…

AcWing第 82 场周赛

第k个数 给定一个长度为 nn 的整数数列 a1,a2,…,ana1,a2,…,an&#xff0c;以及一个整数 kk。 请你计算并输出该数列从大到小排序后的第 kk 个数。 输入格式 第一行包含两个整数 n,kn,k。 第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an。 输出格式 一个整数&#xff0c…

map与set详解

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、两个概念二、set①set的两种遍历方式②set的erase③set的count三、map①SGI-STL中关于键值对的定义②map的insert③访问键值对④map的op…

docker redis容器化(极简教程)

1.通过redis-cli连接你原来的redis&#xff0c;进入后输入info&#xff0c;查看到具体版本号 2.下载redis官方镜像,docker pull redis:你的版本号 3.创建一个新文件夹redis&#xff0c;mkdir -r /hadoop/redis 4.复制你原来的redis.conf&#xff0c;到redis文件夹中,cp /usr/l…