题目地址:
https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/
给定一个长 n n n的整数数组 A A A, ∀ i , 1 ≤ A [ i ] ≤ n \forall i, 1\le A[i]\le n ∀i,1≤A[i]≤n,问 1 ∼ n 1\sim n 1∼n中哪些数没有出现过,要求 O ( 1 ) O(1) O(1)空间复杂度。
我们可以用 A A A自己来标记哪些数出现过,如果某个数 x x x出现过,那么我们就把 A [ x − 1 ] A[x-1] A[x−1]标记为负数,最后看一下哪些位置是正的即可,如果 A [ y ] A[y] A[y]是正的则说明 y + 1 y+1 y+1没有出现过。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> res = new ArrayList<>();
for (int x : nums) {
// 要取一下绝对值,因为我们实际上是要标记|x|是否出现过
x = Math.abs(x);
if (nums[x - 1] > 0) {
nums[x - 1] *= -1;
}
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
res.add(i + 1);
}
}
return res;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。