给定一个长度为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) { // 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; } }
class Solution { public: vector<int> findDisappearedNumbers(vector<int>& nums) { vector<int> res; for (int i = 0; i < nums.size(); i++) { if (nums[abs(nums[i]) - 1] > 0) { nums[abs(nums[i]) - 1] *= -1; } } for (int i = 0; i < nums.size(); i++) { if (nums[i] > 0) { res.push_back(i + 1); } } return res; } };
package main import _"fmt" /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型一维数组 */ func findDisappearedNumbers( nums []int ) []int { cnt:=map[int]bool{} for _,x:=range nums{ cnt[x]=true } ans:=[]int{} for i:=1;i<=len(nums);i++{ if _,ok:=cnt[i];!ok{ ans=append(ans,i) } } return ans }
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param numsLen int nums数组长度 * @return int整型一维数组 * @return int* returnSize 返回数组行数 */ int* findDisappearedNumbers(int* nums, int numsLen, int* returnSize ) { // write code here int *hash=(int *)calloc(numsLen,sizeof(int)); int *ans=(int *)malloc(numsLen*sizeof(int)); for(int i=0;i<numsLen;i++){ hash[nums[i]-1]=1; } int count=0; for(int j=0;j<numsLen;j++){ if(hash[j]==0){ ans[count++]=j+1; } } *returnSize=count; return ans; }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型vector */ vector<int> findDisappearedNumbers(vector<int>& nums) { // write code here //先遍历一遍nums,使得nums[i]上尽可能放i+1 //最后遍历nums,发现nums[i]!=i+1的就是缺失的元素 int i=0; while(i<nums.size()) { int cur=nums[i]; if(cur!=(i+1)) { if(nums[cur-1]!=cur)//如果不等,就交换使得nums[cur-1]=cur { nums[i]=nums[cur-1]; nums[cur-1]=cur; } else//如果已经相等就移到下一个(当前位置可能缺失) { i++; } } else { i++; } } vector<int> rt; for(int i=0;i<nums.size();i++) { if(nums[i]!=i+1) { rt.push_back(i+1); } } return rt; } };
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; }
vector<int> findDisappearedNumbers(vector<int>& nums) { set<int> tmp; vector<int> res; for (int i = 1; i <= nums.size(); i++) { tmp.insert(i); } for (auto p : nums) { if (tmp.find(p) != tmp.end()) { tmp.erase(p); } } for (auto p : tmp) { res.push_back(p); } return res; }