[LeetCode] 442. 数组中重复的数据(Java)
1.题目描述
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
示例 1:输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]
示例 2:输入:nums = [1,1,2]
输出:[1]
示例 3:输入:nums = [1]
输出:[]
2.解题思路
原地哈希算法
可以参考这篇文章 算法 原地哈希算法(java)
3.解法
原地哈希算法
class Solution {public List<Integer> findDuplicates(int[] nums) {List<Integer> list = new ArrayList<>();for (int i = 0; i < nums.length; i++){// 元素对应的索引int index = Math.abs(nums[i]) - 1;// 首次在索引处的元素取反if (nums[index] > 0){nums[index] *= -1;}else {// 如果小于零说明第二次出现list.add(index + 1);} }return list;}
}
4.技能点
原地哈希算法