leetcode 448. Find All Numbers Disappeared in an Array

来源:互联网 发布:四川广电网络客服电话 编辑:程序博客网 时间:2024/06/05 18:09

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]
这个跟之前的一道题目思路类似,取反然后找没有被取反的Index。

import java.util.ArrayList;import java.util.List;public class Find_All_Numbers_Disappeared_in_an_Array448 {public List<Integer> findDisappearedNumbers(int[] nums) {List<Integer> list=new ArrayList<Integer>();int length=nums.length;for(int i=0;i<length;i++){int theVal=Math.abs(nums[i]);if(nums[theVal-1]>0){nums[theVal-1]=-nums[theVal-1];}}for(int i=0;i<length;i++){if(nums[i]>0){list.add(i+1);}}return list;}public static void main(String[] args) {// TODO Auto-generated method stubFind_All_Numbers_Disappeared_in_an_Array448 f=new Find_All_Numbers_Disappeared_in_an_Array448();int[] nums=new int[]{4,3,2,7,8,2,3,1};List<Integer> list=f.findDisappearedNumbers(nums);for(Integer i:list){System.out.print(i+" ");}}}
大神的解法,还有一种思路类似,只不过是把取反变成了+n,遇到了就+n,最后找小于n的就是没出现过的。
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
原创粉丝点击