这是悦乐书的第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实现)的更多相关文章

  1. LeetCode算法题-Self Dividing Numbers(Java实现)

    这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...

  2. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  3. LeetCode算法题-Find Smallest Letter Greater Than Target(Java实现)

    这是悦乐书的第306次更新,第326篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第175题(顺位题号是744).给定一个仅包含小写字母的有序字符数组,并给定目标字母目标 ...

  4. LeetCode算法题-Kth Largest Element in a Stream(Java实现)

    这是悦乐书的第296次更新,第315篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第164题(顺位题号是703).设计一个类来查找流中第k个最大元素.请注意,它是排序顺序 ...

  5. LeetCode算法题-Search in a Binary Search Tree(Java实现)

    这是悦乐书的第295次更新,第314篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第163题(顺位题号是700).给定一个二叉搜索树(BST)的和正整数val. 你需要在 ...

  6. LeetCode算法题-Average of Levels in Binary Tree(Java实现)

    这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...

  7. LeetCode算法题-Minimum Index Sum of Two Lists(Java实现)

    这是悦乐书的第272次更新,第286篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第139题(顺位题号是599).假设Andy和Doris想要选择一家餐馆吃晚餐,他们都有 ...

  8. LeetCode算法题-Reverse Words in a String III(Java实现)

    这是悦乐书的第259次更新,第272篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第126题(顺位题号是557).给定一个字符串,您需要反转句子中每个单词中的字符顺序,同 ...

  9. LeetCode算法题-Find Mode in Binary Search Tree(Java实现)

    这是悦乐书的第246次更新,第259篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第113题(顺位题号是501).给定具有重复项的二叉搜索树(BST),找到给定BST中的 ...

随机推荐

  1. Docker之使用Dockerfile创建定制化镜像(四)--技术流ken

    前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...

  2. Shuffle过程

    Shuffle过程 在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性能高低直接影响了整 ...

  3. [转]win10中安装JDK8以及环境配置

    本文转自:https://blog.csdn.net/yangsummer2426/article/details/80499775 1.      首先下载jdk,网址如下: http://www. ...

  4. JavaScript 图片弹框显示

    function fnCreate(src) {             /* 要创建的div的classname */             var ClassName = "thumb ...

  5. c#调用腾讯云API的实例

    //获取时间戳 .net framework /* DateTime dt = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1 ...

  6. Oracle高效分页查询(转)

    page --没有order by的查询 -- 嵌套子查询,两次筛选(推荐使用) --SELECT * -- FROM (SELECT ROWNUM AS rowno, t.* -- FROM DON ...

  7. SpringBoot 配置静态资源映射

    SpringBoot 配置静态资源映射 (嵌入式servlet容器)先决知识 request.getSession().getServletContext().getRealPath("/& ...

  8. C#设计模式之十六观察者模式(Observer Pattern)【行为型】

    一.引言 今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份)把所有的模式写完,2018年,新的一年写一些新的东西.今天我们开始讲“行为 ...

  9. vue批量验证提交表单的数据是否合规

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. elementUI vue 页面加载的时候页面出现了黑字 页面优化处理 按钮弹出框文字

    elementUI 页面如果需要加载很多东西的时候, 自己定义的按钮或者弹出框dialog的文字就会显示在页面上, 一闪而过, 因此需要优化一下, elementUI 提供的loading有遮罩层, ...