题意

给定一个长度为N整形数组,元素取值 范围从1到N,其中有可能有重复出现两次的元素,找出丢失的元素:

题目来源:https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/

标记难度:Easy

提交次数:1/N

代码效率: 95.58%

Example:

1
2
3
4
5
Input:
[4,3,2,7,8,2,3,1]

Output:
[5,6]

分析:

取负法:不管一个元素出现一次还是两次,只要出现它对应的位置就会被取负。当某个元素不出现的时候,该元素对应的位置始终访问不到,所以还是正值,通过这种方法我们就可以找到哪些元素没有出现

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> list = new ArrayList();
for(int i = 0;i < nums.length;i++){
int val = Math.abs(nums[i]) - 1;
if(nums[val] > 0){
nums[val] = -nums[val];
}
}

for(int j = 0; j<nums.length;j++){
if(nums[j] >0){
list.add(j+1);
}
}
return list;
}
}

一些废话

感觉这个题就是单纯考虑数学技巧,做起来比较吃力,看答案的时候豁然开朗,还是慢慢积累吧。。。