java数据结构与算法刷题-----LeetCode47. 全排列 II

news2024/9/24 9:23:50
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 暴力回溯
    • 2. 分区法+回溯

在这里插入图片描述

此题为46题的衍生题,在46题的基础上,加上了是否重复的判断,除此之外完全一样。

🏆LeetCode46. 全排列https://blog.csdn.net/grd_java/article/details/136683863

1. 暴力回溯

解题思路:时间复杂度O( n n n^n nn),但是严格来说只到了O( n ∗ n ! n*n! nn!)。空间复杂度O(n)
  1. 在46题的基础上增加一些判断是否重复的操作
  2. 首先我们先将数组排序,这样我们就能通过两个相邻值的比较,确定当前值是否是一个重复的值(不止一个它)
  3. 我们进行全排列时,每个位置可以选择任何不同的值,但是现在有重复的值,就必须确保同一个位置,重复的值只选一次
  4. 所以进行全排列时,通过比较相邻的值就可以判断了。但是必须是有序数组才行(重复数字会都挨在一起)
代码

在这里插入图片描述

int[] nums;
    boolean[] numsFlag;//flag数组,true表示当前这个值已经选过
    int len;
    List<List<Integer>> ans = new ArrayList<List<Integer>>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        this.nums = nums;this.len = nums.length;
        this.numsFlag = new boolean[len];
        ArrayList<Integer> records = new ArrayList<>();
        backTracking(records);
        return ans;
    }
    //回溯算法
    public void backTracking(List<Integer> records){
        if(records.size() == len) ans.add(new ArrayList<>(records));//全排列完成后,保存答案
        else{
            for(int i = 0;i<len;i++){//每个位置都可以选任何值,但是如果当前数字已被选过,则必须跳过这个值
                //如果当前值已被选,跳过! 或者 当前值和上一个一样 并且 上一个也没有被选(说明上一个就已经不能选,选了会重复了)
                if(this.numsFlag[i]==true || (i>0 && nums[i] == nums[i-1] && this.numsFlag[i-1] == false) ) continue;
                this.numsFlag[i] = true;//标志为被选过
                records.add(nums[i]);//选择这个数字
                backTracking(records);//进行下一个数字的枚举
                this.numsFlag[i] = false;//枚举完成后,放弃这个值
                records.remove(records.size()-1);//尝试当前位置下一个可能的值
            }
        }
    }

2. 分区法+回溯

解题思路:时间复杂度O( n ∗ n ! ∗ l o g 2 n n*n!*log_2{n} nn!log2n),其中 l o g 2 n log_2{n} log2n是判断是否重复的时间开销。空间复杂度O(n)
  1. 含有重复的元素序列,进行全排列,这个方法就不太好用,因为处理重复很麻烦
  2. 所以这里只能通过笨办法,每次选择数字判断是否重复时,从当前位置可选值中,依次遍历判断我们当前要选的数字是否之前就存在过
  3. 这个算法依然不需要flag数组标志数字是否已经选择过,也不需要事先排序。
  4. 与46题代码几乎完全照搬,只单纯加了一个循环遍历数组,判断是否重复的方法而已。
代码

在这里插入图片描述

class Solution {
    int[] nums;
    int len;
    List<List<Integer>> ans = new ArrayList<List<Integer>>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        this.nums = nums;this.len = nums.length;
        dfs(0);
        return ans;
    }

    private void dfs(int idx) {
        if (idx == len) {
            List<Integer> result = new ArrayList<>();
            for (int num: nums) result.add(num);
            ans.add(result);
        }
        for (int i = idx; i < len; i++) {
            if (isRepeat(nums, idx, i)) continue;//与46题唯一的不同
            swap(nums, idx, i);
            dfs( idx + 1);
            swap(nums, idx, i);
        }
    }
    //log_2{n},判断当前位置i的取值,是否是重复的(之前取过的值)//与46题唯一的不同
    private boolean isRepeat(int[] nums, int idx, int i) {
        while (idx < i) if (nums[idx++] == nums[i]) return true;
        return false;
    }
    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

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

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

相关文章

QT c++ 双精度数拆分和组合 Tool

本文描述QT c的双精度数拆分和合并&#xff0c;即双精度浮点数拆为四个16位无符号整数以及将四个16位无符号整数组合为双精度浮点数。 开发平台&#xff1a;win10QT6.2.4 MSVC2019 64 bit 在本文的最好列出了代码和可执行文件打包下载链接&#xff08;可直接使用&#xff09;…

【数学】【计算几何】1453. 圆形靶内的最大飞镖数量

作者推荐 视频算法专题 本文涉及知识点 数学 计算几何 LeetCoce:1453. 圆形靶内的最大飞镖数量 Alice 向一面非常大的墙上掷出 n 支飞镖。给你一个数组 darts &#xff0c;其中 darts[i] [xi, yi] 表示 Alice 掷出的第 i 支飞镖落在墙上的位置。 Bob 知道墙上所有 n 支飞…

“计算机行业的未来:政策导向、技术创新与发展前景“

从政府工作报告探计算机行业发展 政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&…

Hack The Box-Monitored

目录 信息收集 rustscan dirsearch WEB web信息收集 snmpwalk curl POST身份验证 漏洞探索 漏洞挖掘 sqlmap 登录后台 提权 get user get root 信息收集 rustscan ┌──(root㉿ru)-[~/kali/hackthebox] └─# rustscan -b 2250 10.10.11.248 --range0-65535 --…

攻防世界-misc-arrdeepee

题目链接:攻防世界 (xctf.org.cn) 题目:我们某一个box被pwn了。在检查过程中,我们发现了一个叫mimikatz的东西,我们以前没有安装过,所以我们清除了,并且重新安装了box。但是,我们忘记备份我们的flag文件了。幸运的是,我们有一个攻击者网络流量捕获。你可以帮我们恢复出…

第12集《天台教观纲宗》

请大家打开讲义第二十一页&#xff0c;我们看己二、明稍利随时得入。 蕅益大师在《弥陀要解》讲一个很重要的概念&#xff0c;提醒所有净土宗的行者&#xff0c;他说&#xff1a;方便有多门&#xff0c;归元无二路。学佛它有两个概念&#xff1a;一个是方便&#xff0c;一个是归…

Android 录屏操作

Android 录屏操作 本文主要介绍android中如何通过MediaRecorder实现录屏操作的. 1: 申请权限 <uses-permission android:name"android.permission.RECORD_AUDIO" /> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"…

vue3动态组件未渲染问题

渲染问题 component动态组件写法与vue2写法一致&#xff0c;代码如下&#xff1a; <component :is"componentName"/><script setup>import { ref } from vueimport account from ./user/account.vue// 组件名称const componentName ref(account)// 点击…

密码学——MAC

消息认证码 在信息发送和接收过程中,若攻击者能够得到信息,进行篡改,就能达到欺骗,诈骗,冒名顶替的作用。为了防止冒名诈骗,一个对策就是使用消息认证码——MAC: Message Authentication Code。 消息认证码,即确定消息真实性的认证程序。发件人将想要发送的信息和从哪个…

挑战OpenAI的新模型免费上线,40%计算量性能逼近GPT-4

据介绍,Inflection-2.5 将强大的 LLM 能力与 Inflection 标志性的「同理心微调」结合在一起,兼具高情商与高智商,可联网获取事实信息,其性能可与 GPT-4、Gemini 等领先大模型相媲美。 本周四,美国 AI 创业公司 Inflection AI 正式发布新一代大语言模型 Inflection-2.5。 …

es 聚合操作(二)

书接上文&#xff0c;示例数据在上一篇&#xff0c;这里就不展示了 一、Pipeline Aggregation 支持对聚合分析的结果&#xff0c;再次进行聚合分析。 Pipeline 的分析结果会输出到原结果中&#xff0c;根据位置的不同&#xff0c;分为两类&#xff1a; Sibling - 结果和现有…

Github 2024-03-15 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-15统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3Python项目3非开发语言项目2PHP项目1C#项目1Rust项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476…

N沟道功率MOSFET--FDA59N30 助力提高电源效率 为设备节能做出贡献

FDA59N30 UniFETTM MOSFET 是高压 MOSFET产品&#xff0c;基于平面条形和 DMOS 技术。 该 MOSFET 产品专用于降低通态电阻&#xff0c;并提供更好的开关性能和更高的雪崩能量强度。适用于开关电源转换器应用&#xff0c;如功率因数校正&#xff08;PFC&#xff09;、平板显示器…

c++简单使用

取消同步流是为了解决C有时遇到空格或回车&#xff08;不到\0&#xff09;就会停下的问题 #include<bits/stdc.h> using namespace std; int main() {//取消同步流ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int a, b;cin >> a>> b;cout << …

上海亚商投顾:沪指三连阴 创新药、资源回收概念逆势走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日冲高回落&#xff0c;深成指、创业板指午后跌超1%&#xff0c;临近尾盘跌幅有所收窄。创新药板块…

kyuubi整合微服务效果整理

目录 概述展示整合效果nacosadmin server请求 结束 概述 在各种奇葩需求之下&#xff0c;公司大数据&#xff0c;在资源不够的情况下&#xff0c;还要做资源高配的负载均衡&#xff0c;虽说非正道。但还是试一下。 展示 整合 整合 nacos 做资源配置动态刷新整合 spring boo…

Spring Boot 中@Scheduled是单线程还是多线程?

在开发Spring Boot应用程序时&#xff0c;定时任务是一项常见的需求。Spring Boot提供了Scheduled注解&#xff0c;可用于将方法标记为定时任务&#xff0c;并在预定的时间间隔内执行。那么Scheduled注解的执行方式是单线程执行&#xff0c;还是多线程执行&#xff1f;Schedule…

【Redis】Redis常用命令之Hash

1.hset&#xff1a;设置hash中指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09;。 HSET key field value [field value ...]时间复杂度&#xff1a;插⼊⼀组field为O(1),插⼊N组field为O(N)。 返回值&#xff1a;添加的字段的个数。 2.hget&#xf…

【视觉三维重建】【论文笔记】Deblurring 3D Gaussian Splatting

去模糊的3D高斯泼溅&#xff0c;看Demo比3D高斯更加精细&#xff0c;对场景物体细节的还原度更高&#xff0c;[官网]&#xff08;https://benhenryl.github.io/Deblurring-3D-Gaussian-Splatting/&#xff09; 背景技术 Volumetric rendering-based nerual fields&#xff1a…

邀请媒体到场报道与采访的优势分析

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体到场报道与采访的优势主要有&#xff1a; 提高知名度和曝光率&#xff1a;通过媒体的广泛传播&#xff0c;让更多人了解活动或品牌&#xff0c;增强其在公众中的认知度。 树立权…