LeetCode 448. Find All Numbers Disappeared in an Array

问题描述

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]

问题分析

给定一个长度为n的数组,其中的数的范围是[1,n].其中有些数会出现两次。求出其中没有出现的数。
正常的做法是排序,然后比较下标。时间复杂度是O(nlogn)。也可以使用一个数组记录出现的情况,遍历一下数组,记录出现的情况,时间复杂度是O(n)。空间复杂度是O(n)。
题目要求是时间复杂度是O(n)。空间复杂度是O(1)。这里可以使用当前的数组来记录是否出现。记录的方式有两种,一种使用符号来表示是否出现。同时也可以使用 +N表示出现了一次,这样能够记录更多的数据。

代码实现
public List<Integer> findDisappearedNumbers(int[] nums) {

        if (nums == null || nums.length == 0) {
            return Collections.emptyList();
        }
        for (int i = 0; i < nums.length; i++) {
            int pointIndex = Math.abs(nums[i]) - 1;
            if (nums[pointIndex] > 0) {
                nums[pointIndex] = -1 * nums[pointIndex];
            }
        }
        List<Integer> result = new ArrayList<Integer>();
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) {
                result.add(i + 1);
            }
        }
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值