leetcode -- 448. Find All Numbers Disappeared in an Array【数组】

来源:互联网 发布:十三交友平台 知乎 编辑:程序博客网 时间:2024/04/30 10:48

题目

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]

题意:
给定一个整型数组,在该数组中满足 1 <= a[i] <= n (n是数组的大小)一些数字出现了两次,一些没有出现。找出所有[1,n]中的没有
出现在数组中的元素。

解法

解法1:

  • 游标】双向游标的使用。(源游标,目标游标)
  • 朴素的做法
    public List<Integer> findDisappearedNumbers(int[] nums) {        List <Integer> out  = new ArrayList<>();        Arrays.sort(nums);        int current = 1;        for(int i = 0;i<nums.length;){            if(nums[i] == current){                current ++;                i++;            }else if(nums[i] < current){                i++;            }else{                out.add(current++);            }        }        for(int j = current; j <= nums.length;j++){            out.add(j);        }        return out;    }

解法2

  • 数组下标,与其中的值在同一个空间中。

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;    }
0 0
原创粉丝点击