给定一个长度为N的正整数数组nums,其中nums[i]的值都在区间[1,n]中,请你找出nums数组在[1,n]范围里面没有出现过的数字,并将它们放在数组里面返回(在数组里面的顺序可以不唯一)
注:本题有时间复杂度为O(n),空间复杂度为O(1)的解法,返回的数组不计入空间复杂度计算
数据范围:
[2,1,4,5,1,2]
[3,6]
数组长度为6,那么范围为[1,6],其中3和6没有在数组里面出现,返回[3,6]
[1,1]
[2]
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); } }
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; }
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; } }