LeetCode算法题-Find All Numbers Disappeared in an Array(Java实现)
这是悦乐书的第232次更新,第245篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第99题(顺位题号是448)。给定一个整数数组,其中1≤a[i]≤n(n =数组的大小),一些元素出现两次,其他元素出现一次。找到[1,n]包含的所有元素,这些元素不会出现在此数组中。你可以在没有额外空间和O(n)运行时的情况下完成吗? 您可以假设返回的列表不计入额外空间。例如:
输入:[4,3,2,7,8,2,3,1]
输出:[5,6]
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
特殊情况:当数组中没有元素时,直接返回空list。
正常情况:先将数组排序,然后获取数组的第一个元素作为起始索引index,如果数组第一个元素不等于1,因为1≤a[i]≤n,所以需要先将前面缺的部分补起来。然后开始循环判断数组中的元素,如果index和当前元素相等,那么index自加1,循环内部的指针也加1;反之不相等,则需要判断当前元素和前一个元素是否相等,如果相等,循环内部的指针加1,否则就将index添加进list中,index再自加1。最后,还需要在判断一次,如果index小于数组的长度,则需要将后面缺的数也补起来。
此解法的时间复杂度是O(n log(n)),空间复杂度是O(1)。
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> list = new ArrayList<Integer>();
if (nums == null || nums.length < 1) {
return list;
}
Arrays.sort(nums);
int index = nums[0];
if (index != 1) {
for (int k=1; k<index; k++) {
list.add(k);
}
}
for (int i=0; i<nums.length; ) {
if (index == nums[i]) {
index++;
i++;
} else {
if (nums[i] == nums[i-1]) {
i++;
} else {
list.add(index++);
}
}
}
for (int j = index; j<=nums.length; j++) {
list.add(j);
}
return list;
}
03 第二种解法
利用标记。因为1≤a[i]≤n,我们可以单独再新建一个数组,数组的长度是n+1,然后将nums中的元素作为索引,在新数组中对元素进行自加。然后判断新数组中,那些等于0的元素的索引就是nums中缺失的数。
public List<Integer> findDisappearedNumbers2(int[] nums) {
List<Integer> list = new ArrayList<Integer>();
if (nums == null || nums.length < 1) {
return list;
}
int[] temp = new int[nums.length+1];
for (int num : nums) {
temp[num]++;
}
for (int i=1; i<temp.length; i++) {
if (temp[i] == 0) {
list.add(i);
}
}
return list;
}
04 第三种解法
还是利用标记。在第二种解法中,我们使用了新数组,在此解法中,我们直接对nums进行标记。先遍历nums的元素,顺着索引,将其中的正数元素标记为负数。然后再去遍历数组,如果当前元素为正数,则说明其所在索引没有遇见过,就将其添加进list中。
public List<Integer> findDisappearedNumbers3(int[] nums) {
List<Integer> list = new ArrayList<Integer>();
if (nums == null || nums.length < 1) {
return list;
}
for (int i = 0; i < nums.length; i++) {
int val = Math.abs(nums[i]) - 1;
if (nums[val] > 0) {
nums[val] = -nums[val];
}
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
list.add(i+1);
}
}
return list;
}
05 小结
算法专题目前已日更超过三个月,算法题文章99+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Find All Numbers Disappeared in an Array(Java实现)的更多相关文章
- LeetCode算法题-Self Dividing Numbers(Java实现)
这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Find Smallest Letter Greater Than Target(Java实现)
这是悦乐书的第306次更新,第326篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第175题(顺位题号是744).给定一个仅包含小写字母的有序字符数组,并给定目标字母目标 ...
- LeetCode算法题-Kth Largest Element in a Stream(Java实现)
这是悦乐书的第296次更新,第315篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第164题(顺位题号是703).设计一个类来查找流中第k个最大元素.请注意,它是排序顺序 ...
- LeetCode算法题-Search in a Binary Search Tree(Java实现)
这是悦乐书的第295次更新,第314篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第163题(顺位题号是700).给定一个二叉搜索树(BST)的和正整数val. 你需要在 ...
- LeetCode算法题-Average of Levels in Binary Tree(Java实现)
这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...
- LeetCode算法题-Minimum Index Sum of Two Lists(Java实现)
这是悦乐书的第272次更新,第286篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第139题(顺位题号是599).假设Andy和Doris想要选择一家餐馆吃晚餐,他们都有 ...
- LeetCode算法题-Reverse Words in a String III(Java实现)
这是悦乐书的第259次更新,第272篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第126题(顺位题号是557).给定一个字符串,您需要反转句子中每个单词中的字符顺序,同 ...
- LeetCode算法题-Find Mode in Binary Search Tree(Java实现)
这是悦乐书的第246次更新,第259篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第113题(顺位题号是501).给定具有重复项的二叉搜索树(BST),找到给定BST中的 ...
随机推荐
- μC/OS-II 信号量集
简介 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.μC/OS-II 为了实现多个信号量组合的功能定义了一种特殊的数据结构--信号量集. 信号量集所能 ...
- 【转】CentOS系统操作下安装相关各种软件
CentOS系统是非常强大经常应用的系统,我就对CentOS系统深入探讨学习,对大家概括讲述CentOS系统应用,希望对大家有用.虽然CentOS Linux使用了RHEL的源代码,但是由于这些源代码 ...
- [转]nodejs中package.json和package-lock.json文件的功能分析
本文转自:https://blog.csdn.net/u013992330/article/details/81110018 最新版nodejs中,多了一个package-lock.json文件,刚开 ...
- JQuery官方学习资料(译):遍历
一旦你通过JQuery创建了选择器,你就可以对此进行更为深入的遍历.遍历可以分为三个基本组成部分,父节点.子节点和兄弟节点.JQuery为这些部分提供了许多丰富易用的方法. <div c ...
- Java Date类的使用总结
Date类表示特定的瞬间,精确到毫秒. 有2种方法可以创建Date对象(这里不考虑已过时的构造函数) 1.public Date()——分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫 ...
- Android破解学习之路(十六)—— dll破解的IL指令
IL指令介绍 IL是.NET框架中中间语言(Intermediate Language)的缩写. 使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不 ...
- python多任务-线程
目录 多任务的概念 线程基础 单线程执行 多线程执行 主线程会等待所有子线程结束后才结束 查看线程数量 线程-注意点 线程执行代码的封装 线程的执行顺序 总结 多任务的概念 什么叫"多任务& ...
- python面向对象学习(六)类属性、类方法、静态方法
目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...
- es6 语法 (iterator和for...of循环)
Iterator遍历器 遍历器(Iterator)就是这样一种机制.它是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据 ...
- MongoDB 3.0 WT引擎参考配置文件
单实例: systemLog: destination: file ###日志存储位置 path: /data/mongodb/log/mongod.log logAppend: true stora ...