leetcode第47题

简介: 基本上都是在上道题的基础上改出来了,一些技巧也是经常遇到,比如先排序,然后判断和前一个是否重复。利用 Hash 去重的功能。利用原来的存储空间隐藏掉数据,然后再想办法还原。

image.png

上一道题类似,不同之处就是给定的数字中会有重复的,这样的话用之前的算法会产出重复的序列。例如,[ 1 1 ],用之前的算法,产生的结果肯定是 [ [ 1 1 ], [ 1 1 ] ],也就是产生了重复的序列。但我们可以在上一题的解法中进行修改从而解决这道题。

解法一 插入

这个没想到怎么在原基础上改,可以直接了当些,在它产生的结果里,对结果去重再返回。对于去重的话,一般的方法肯定就是写两个 for 循环,然后一个一个互相比较,然后找到重复的去掉。这里,我们用 39题 解法二中提到的一种去重的方法。

publicList<List<Integer>>permuteUnique(int[] nums) {
List<List<Integer>>all=newArrayList<>(); 
List<Integer>temp=newArrayList<>();
temp.add(nums[0]);
all.add(temp); 
for (inti=1; i<nums.length; i++) {
intcurrent_size=all.size();
for (intj=0; j<current_size; j++) {
List<Integer>last=all.get(j);
for (intk=0; k<=i; k++) {
if (k<i&&nums[i] ==last.get(k)) {
continue;
                }
temp=newArrayList<>(last);
temp.add(k, nums[i]);
all.add(temp);
            }
        }
for (intj=0; j<current_size; j++) {
all.remove(0);
        }
    }
returnremoveDuplicate(all);
}
privateList<List<Integer>>removeDuplicate(List<List<Integer>>list) {
Map<String, String>ans=newHashMap<String, String>();
for (inti=0; i<list.size(); i++) {
List<Integer>l=list.get(i);
Stringkey="";
// [ 2 3 4 ] 转为 "2,3,4"for (intj=0; j<l.size() -1; j++) {
key=key+l.get(j) +",";
        }
key=key+l.get(l.size() -1);
ans.put(key, "");
    }
// 根据逗号还原 ListList<List<Integer>>ans_list=newArrayList<List<Integer>>();
for (Stringk : ans.keySet()) {
String[] l=k.split(",");
List<Integer>temp=newArrayList<Integer>();
for (inti=0; i<l.length; i++) {
intc=Integer.parseInt(l[i]);
temp.add(c);
        }
ans_list.add(temp);
    }
returnans_list;
}

解法二 交换

这个改起来相对容易些,之前的想法就是在每一个位置,让每个数字轮流交换过去一下。这里的话,我们其实只要把当前位置已经有哪些数字来过保存起来,如果有重复的话,我们不让他交换,直接换下一个数字就可以了。

publicList<List<Integer>>permuteUnique(int[] nums) {
List<List<Integer>>all=newArrayList<>();
Arrays.sort(nums);
upset(nums, 0, all);
returnall;
}
privatevoidupset(int[] nums, intbegin, List<List<Integer>>all) {
if (begin==nums.length) {
ArrayList<Integer>temp=newArrayList<Integer>();
for (inti=0; i<nums.length; i++) {
temp.add(nums[i]);
        }
all.add(newArrayList<Integer>(temp));
return;
    }
HashSet<Integer>set=newHashSet<>(); //保存当前要交换的位置已经有过哪些数字了for (inti=begin; i<nums.length; i++) {
if (set.contains(nums[i])) { //如果存在了就跳过,不去交换continue;
        }
set.add(nums[i]);
swap(nums, i, begin);
upset(nums, begin+1, all);
swap(nums, i, begin);
    }
}
privatevoidswap(int[] nums, inti, intbegin) {
inttemp=nums[i];
nums[i] =nums[begin];
nums[begin] =temp;
}

基本上都是在上道题的基础上改出来了,一些技巧也是经常遇到,比如先排序,然后判断和前一个是否重复。利用 Hash 去重的功能。利用原来的存储空间隐藏掉数据,然后再想办法还原。

相关文章
|
人工智能 BI 调度
帆软report10.0,从人工智能到人工+智能
帆软report10.0,从人工智能到人工+智能
475 0
|
机器学习/深度学习 人工智能 算法
解密人工智能
一、机器学习算法简介 1.1 机器学习算法包含的两个步骤 1.2 机器学习算法的分类 二、决策树 2.1 优点 2.2 缺点 三、随机森林 四、Naive Bayes(朴素贝叶斯) 五、结语
202 0
C国演义 [第十章]
C国演义 [第十章]
|
编解码 算法
基于自适应运动补偿的双向运动估计算法matlab仿真
基于自适应运动补偿的双向运动估计算法matlab仿真
|
机器学习/深度学习 算法 计算机视觉
YOLOv8改进-论文笔记】 AKConv(可改变核卷积):任意数量的参数和任意采样形状的即插即用的卷积
AKConv是一种可改变核卷积,旨在解决传统卷积的局限,包括固定大小的卷积窗口和卷积核尺寸。AKConv提供灵活的卷积核参数和采样形状,适应不同尺度特征。其创新点包括:1)支持任意大小和形状的卷积核;2)使用新算法确定初始采样位置;3)应用动态偏移调整采样位置;4)优化模型参数和计算效率。AKConv已应用于YOLOv8,提高网络性能。相关代码可在<https://github.com/CV-ZhangXin/AKConv>找到。
|
存储 算法 安全
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
209 0
|
SQL Java 数据库连接
JDBC存在什么问题?MyBatis是如何解决的?
本文详细探讨了JDBC(Java Database Connectivity)在实际应用中存在的问题,如代码繁琐、资源管理困难、SQL语句硬编码、缺乏对象映射及事务管理和缓存支持不足等。JDBC的核心组件包括`DriverManager`、`Connection`、`Statement`、`ResultSet`和`SQLException`。为了解决这些问题,文章介绍了MyBatis框架的优势,如简化代码编写、自动资源管理、SQL与代码分离、支持对象关系映射(ORM)、简化事务管理和内置缓存机制。通过具体示例展示了MyBatis如何优化数据库操作。理解JDBC的原理有助于更好地掌握ORM框架。
185 0
|
人工智能 自动驾驶 云栖大会
2023云栖大会 阿里云CTO周靖人,打造一朵AI时代最开放的云
2023云栖大会上,阿里云宣布了一项重磅计划:阿里云高校计划,助力高校科研与教育加速,让每位中国在校大学生真实受益于普惠算力。目前,清华大学、北京大学、浙江大学、上海交通大学、中国科学技术大学、华南理工大学等高校已首批达成合作。
89788 307
|
监控 应用服务中间件 数据库
Django 应用部署也太让人头疼了吧!但掌握这些,你就能轻松搞定,快来一探究竟!
【8月更文挑战第31天】作为一名开发者,将Django应用从开发环境顺利部署到生产环境至关重要。这涉及技术操作与实际考量,需确保应用稳定高效运行。从开发到部署至如DigitalOcean等云服务器,每一步——包括安装必要软件、配置数据库、使用Git上传代码、设置Nginx和Gunicorn、实施安全措施以及监控和日志记录——都需遵循最佳实践,以提供可靠的用户服务。
285 0
|
安全 Linux 网络安全
Samba局域网共享文件
Samba局域网共享文件