442. 数组中重复的数据
一、题目
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[2,3]
二、题解
-
统计的数字 1 2 3 4 5 6 7 8 nums索引 0 1 2 3 4 5 6 7 nums元素 4 3 2 7 8 2 3 1 第一轮 -7 第二轮 -2 第三轮 -3 第四轮 -3 第五轮 -1 第六轮 N<0 记录|2| 第七轮 N<0 记录|-3| 第八轮 -4 nums结果 -4 -3 -2 -7 8 2 -3 -1
class Solution {
public List<Integer> findDuplicates(int[] nums) {
List result = new <Integer> ArrayList();
for (int i = 0; i < nums.length; i++) {
if (nums[Math.abs(nums[i])-1]>0) {
nums[Math.abs(nums[i])-1] *= -1;
} else {
result.add(Math.abs(nums[i]));
}
}
return result;
}
}
-
时间复杂度O(n)
-
空间复杂度O(1)
-
执行用时:8 ms, 在所有 Java 提交中击败了50.00%的用户
-
内存消耗:47.3 MB, 在所有 Java 提交中击败了83.42%的用户

浙公网安备 33010602011771号