持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
力扣442. 数组中重复的数据
一、题目描述:
给你一个长度为 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] 输出:[]
提示:
n == nums.length
1 <= n <= 10^5
1 <= nums[i] <= n
nums 中的每个元素出现 一次 或 两次
来源:力扣(LeetCode) 链接:leetcode.cn/problems/fi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
这道题目的难度在于以O(n)的时间复杂度来完成这道题目,如果没有这个要求,可以暴力解决。
那么如果是O(n)的时间复杂度,我们应该怎样解决这道题目呢?
因为数组有n个数,数的范围为1到n。且每个整数是出现一次或两次。
所以我们可以通过将每个数放在对应的位置上,即他们的值减1的位置上。
最后统计有几个值不在位置上即可知道哪些值出现了两次。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
这个方法真的妙极了!真是妙蛙种子吃着妙脆角妙进了米奇妙妙屋,妙到家了。
三、AC 代码:
int* findDuplicates(int* nums, int numsSize, int* returnSize) {
for (int i = 0; i < numsSize; ++i) {
while (nums[i] != nums[nums[i] - 1]) {
int temp = nums[i];
nums[i] = nums[temp - 1];
nums[temp - 1] = temp;
}
}
int *ans = (int *)malloc(sizeof(int) * numsSize);
int pos = 0;
for (int i = 0; i < numsSize; ++i) {
if (nums[i] - 1 != i) {
ans[pos++] = nums[i];
}
}
*returnSize = pos;
return ans;
}
四、总结:
题目链接:442. 数组中重复的数据
题目很好,体验很好~希望下次不要再出了。。。。