首页 > 试题广场 >

数组里面没有出现过的数字

[编程题]数组里面没有出现过的数字
  • 热度指数:1268 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为N的正整数数组nums,其中nums[i]的值都在区间[1,n]中,请你找出nums数组在[1,n]范围里面没有出现过的数字,并将它们放在数组里面返回(在数组里面的顺序可以不唯一)

注:本题有时间复杂度为O(n),空间复杂度为O(1)的解法,返回的数组不计入空间复杂度计算

数据范围:


示例1

输入

[2,1,4,5,1,2]

输出

[3,6]

说明

数组长度为6,那么范围为[1,6],其中3和6没有在数组里面出现,返回[3,6]  
示例2

输入

[1,1]

输出

[2]
时间复杂度为O(n),空间复杂度为O(1)的解法
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型一维数组
     */
    public int[] findDisappearedNumbers (int[] nums) {
        int n = nums.length;
        int p = 0;
        while (p < n) {
            int idx = nums[p];
            int temp = nums[idx - 1];
            nums[idx - 1] = idx;
            nums[p] = temp;
            if (nums[nums[p] - 1] == nums[p]) {
                p ++;
            }
        }
        int count = 0;
        for (int i = 0; i < n; i ++) {
            if (nums[i] != i + 1) {
                nums[count ++] = i + 1;
            }
        }
        return Arrays.copyOfRange(nums, 0, count);
    }
}

时间复杂度:O(n)
空间复杂度:O(1)

发表于 2022-03-05 22:03:42 回复(0)
java的
    public int[] findDisappearedNumbers (int[] nums) {
        // write code here
        int cnt = 0;
        for(int i = 0; i < nums.length; ++i) {
            while(nums[i] > 0 && nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]) {
                int tmp = nums[nums[i] - 1];
                nums[nums[i] - 1] = nums[i];
                nums[i] = tmp;
            }
            if(nums[i] > 0 && nums[i] != i + 1) {
                nums[i] = -1;
                ++cnt;
            }
        }
        int[] ans = new int[cnt];
        int idx = 0;
        for(int i = 0; i < nums.length; ++i) {
            if(nums[i] < 0) {
                ans[idx++] = i + 1;
            }
        }
        return ans;
    }


发表于 2022-02-24 22:30:51 回复(0)
java的
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型一维数组
     */
    public int[] findDisappearedNumbers (int[] nums) {
        // write code here
        int n = nums.length;
        int size = n;
        //值是1 - n
        //索引是0 - n-1
        for (int i = 0; i < n; i++) {
            int index = nums[i];
            while(index != -1){
                int temp = nums[index - 1];
                nums[index - 1] = - 1;
                index = temp;
                if(index != -1){
                    size--;
                }
            }
        }
        int[] res = new int[size];
        for (int i = 0; i < n; i++) {
            if(nums[i] != -1){
                res[--size] = i + 1;
            }
            if(size == -1){
                return res;
            }
        }
        return res;
    }
}

发表于 2022-01-28 16:45:22 回复(0)