问题
范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组元素一些出现了两次,一些出现一次。
找到在 [1, n] 范围之间没有出现在数组中的数字。
不使用额外空间且时间复杂度为O(n), 返回的数组不算在额外空间内。
例子
思路
代码
//方法1
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> list = new ArrayList<>();
int i=0;
while (i<nums.length) {
int ele=nums[i];
//如果nums[ele-1]上的元素是ele,就跳过该下标
if (nums[ele-1]==ele){
i++;
continue;
}else {
//否则把下标ele-1和i的元素互换
int t = nums[ele-1];
nums[ele-1]=nums[i];
nums[i]=t;
}
}
for (int j=0; j<nums.length; j++)
if (nums[j]!=j+1) list.add(j+1);
return list;
}
}
//方法2
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
//n和下标n-1 一一对应
List<Integer> list = new ArrayList<>();
for(int i=0; i<nums.length; i++) {
//数都是正的,该位置可能已被修改为负的,所以
int n = Math.abs(nums[i]);
//有可能已经出现过【表现为数为负的】,让所有出现的n对应的下标n-1的元素为负
nums[n-1]=-Math.abs(nums[n-1]);
}
//返回所有 没有修改的数的下标+1
for (int i=0; i<nums.length; i++)
if (nums[i]>0) list.add(i+1);
return list;
}
}
//方法1
class Solution:
def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
#让n-1下标放n
i=0
while i<len(nums):
n=nums[i]
if nums[n-1]==n:
i+=1
continue
else:
t=nums[n-1]
nums[n-1]=n
nums[i]=t
return [j+1 for j in range(len(nums)) if nums[j]!=j+1]
//方法2
class Solution:
def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
for i in range(len(nums)):
#有可能修改多,但元素都是正的,
ele = abs(nums[i])
#
nums[ele-1]=-abs(nums[ele-1])
return [j+1 for j in range(len(nums)) if nums[j]>0]