难度: 中等 | 标签: 数组

1. 题目描述

https://leetcode.cn/problems/find-all-duplicates-in-an-array/
给你一个长度为 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 <= 105
  • 1 <= nums[i] <= n
  • nums 中的每个元素出现 一次 或 两次

通过次数: 55,135 | 提交次数: 78,184

2. 题解

2022-05-08 AC

  1. <?php
  2. /**
  3. * Created by PhpStorm
  4. * User: jtahstu
  5. * Time: 2022/5/7 23:53
  6. * Des: 442. 数组中重复的数据
  7. * https://leetcode.cn/problems/find-all-duplicates-in-an-array/
  8. * 给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
  9. * 你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
  10. */
  11. class Solution
  12. {
  13. /**
  14. * @param Integer[] $nums
  15. * @return Integer[]
  16. */
  17. function findDuplicates($nums)
  18. {
  19. $res = [];
  20. foreach ($nums as $num) {
  21. $nums[abs($num) - 1] *= -1;
  22. if ($nums[abs($num) - 1] > 0) {
  23. $res[] = abs($num);
  24. }
  25. }
  26. // print_r($nums);
  27. return $res;
  28. }
  29. }
  30. var_dump((new Solution)->findDuplicates([4, 3, 2, 7, 8, 2, 3, 1]));
  31. /**
  32. * 执行用时:116 ms, 在所有 PHP 提交中击败了25.00%的用户
  33. * 内存消耗:27.1 MB, 在所有 PHP 提交中击败了66.67%的用户
  34. * 通过测试用例:28 / 28
  35. */