【LeetCode】448. Find All Numbers Disappeared in an Array

来源:互联网 发布:人工智能现状和趋势 编辑:程序博客网 时间:2024/06/06 20:45

问题描述

问题链接:https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/#/description

Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements of [1, n] inclusive that do not appear in this array.

Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.

Example:

Input:[4,3,2,7,8,2,3,1]Output:[5,6]

我的代码

我没有想到不用额外的空间就解决的办法,所以我的答案很简单,就直接上代码了。

public class Solution {    public List<Integer> findDisappearedNumbers(int[] nums) {        /*        不使用额外的内存我还是不会做,等着学习讨论区的大神们吧        */        int len = nums.length;        boolean[] flags = new boolean[len + 1];        for(int i = 0; i < len; i++){            flags[nums[i]] = true;        }        List<Integer> numList = new ArrayList<Integer>();        for(int i = 1; i <= len; i++){            if(!flags[i]){                numList.add(i);            }        }        return numList;    }}

打败了41.4%的Java代码。来看一下讨论区。

讨论区

Java accepted simple solution

链接地址:https://discuss.leetcode.com/topic/65738/java-accepted-simple-solution

巧妙地在原数组里面蕴含了1bit的信息,不错。

The basic idea is that we iterate through the input array and mark elements as negative using nums[nums[i] -1] = -nums[nums[i]-1]. In this way all the numbers that we have seen will be marked as negative. In the second iteration, if a value is not marked as negative, it implies we have never seen that index before, so just add it to the return list.

public List<Integer> findDisappearedNumbers(int[] nums) {    List<Integer> ret = new ArrayList<Integer>();    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) {            ret.add(i+1);        }    }    return ret;}

5-line Java Easy-understanding

链接地址:https://discuss.leetcode.com/topic/66063/5-line-java-easy-understanding

这个也是类似的思想

public List<Integer> findDisappearedNumbers(int[] nums) {    List<Integer> res = new ArrayList<>();    int n = nums.length;    for (int i = 0; i < nums.length; i ++) nums[(nums[i]-1) % n] += n;    for (int i = 0; i < nums.length; i ++) if (nums[i] <= n) res.add(i+1);    return res;}
0 0
原创粉丝点击