刚看到这道题的时候,脑子里先想到是异或,可能是这几天做关于异或的题比较多,所以就会往这个方向想。但是想了半天也没有想到用这种方法应该怎么做。之后就用最笨的方法来做,但是时间复杂度是O(n2)。代码如下:
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> li = new ArrayList<Integer>();
boolean isExist = false;
for(int i = 1; i < nums.length + 1;i ++) {
for(int j = 0; j < nums.length; j ++) {
if(i == nums[j]) {
isExist = true;
break;
}
}
if(isExist == false) li.add(i);
isExist = false;
}
return li;
}
提交之后复杂度是不能通过的,出现了超时的错误
Time Limit Exceeded。
之后我去网上百度这道题的思路,终于在理解的情况下写出了算法,
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> li = new ArrayList<Integer>();
for(int i = 0; i < nums.length; i ++) {
int index = Math.abs(nums[i]) - 1;
if(nums[index] > 0)
nums[index] = -nums[index];
}
for(int j = 0; j < nums.length; j ++) {
if(nums[j] > 0) li.add(j + 1);
}
return li;
}
这个题其实没有设计到算法的问题,只是单纯的技巧问题,简单题的技巧掌握了,对后面的算法的题会有很大的帮助。