Question:
Suppose you have an array of 1001 integers. The integers are in random order, but you know each of the integers is between 1 and 1000 (inclusive). In addition, each number appears only once in the array, except for one number, which occurs twice. Assume that you can access each element of the array only once. Describe an algorithm to find the repeated number. If you used auxiliary storage in your algorithm, can you find an algorithm that does not require it?
如果可以用辅助空间的话,可以用HashSet来处理,如果add失败说明有重复的。但是如果不能用额外空间的话呢?
Solution 1:
考虑加法。1+2+...+n = n(n-1)/2
假设数组所有元素之和为sum, 那么sum-n(n-1)/2就是我们要找的重复的数。
public int findDuplicate(int[] nums) { int sum = 0; int n = nums.length; int expected = n*(n-1)/2; for(int i=0; i<n; i++) { sum += nums[i]; } return sum-expected; }
但是数组的元素数达到或接近INT_MAX的时候, 加法运算就会溢出。我们还可以考虑位运算XOR。
XOR具有以下性质:
交换律:
结合律:
恒等律:
归零律:
自反:
假设给定数组A[6] = {5,2,3,4,3,1},而我们期望的数组应该为A[6]={0,1,2,3,4,5}。其中我们用0来代替重复的元素。
接下来对给定数组和我们期望数组的所有元素做异或运算:
(5^0)^(2^1)^(3^2)^(4^3)^(3^4)^(1^5)
= (5^5)^(2^2)^(3^3)^(4^4)^(1^1)^(3^0)
= 0^3
= 3
写成代码则非常简单。
Solution2:
public int findDuplicate(int[] nums) { int dup = 0; for(int i=0; i<nums.length; i++) { dup ^= nums[i]^i; } return dup; }
Reference:
相关推荐
element in the array. //How can you sort an array and remove duplicate entries. A few questions on Big O efficiency. Questions on memory management. * //Implement a HashMap. Try to stick to the syntax...
Key operations include `find` (determining which subset an element belongs to) and `union` (merging two subsets into one). 4. **Perspective**: The chapter provides a perspective on the importance of...
Duplicate (E) 48. Rotate Image (M) -> 2 73. Set Matrix Zeroes (M) 1. Two Sum (E) 167. Two Sum II - Input array is sorted (E) 653. Two Sum IV - Input is a BST (E) -> 2 26. Remove Duplicates from Sorted...
System.out.println("Duplicate element found: " + array[i]); } } } } } ``` 然而,更高效的方法是使用哈希集(HashSet)或哈希表(HashMap)。哈希集在Java中由`java.util.HashSet`类提供,它不包含重复...
java lru leetcode Phone interview: Implement hashmap Second minimum number in array given a sorted array, rotated at a ...find ...element ...然后记得最开始问清楚可不可以有duplicate ...Find an
421 | [Maximum XOR of Two Numbers in an Array](https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/) | [C++](./C++/maximum-xor-of-two-numbers-in-an-array.cpp) [Python](./Python/...
- Initialize input array to zero in AcpiInitializeTables - Additional parameter validation for AcpiGetTable, AcpiGetTableHeader, AcpiGetTableByIndex Change for GPE support: when a "wake" GPE is ...
14. LeetCode第1486题:"XOR Operation in an Array"(数组的异或操作):对于数组arr,执行一系列异或操作,每次对一个区间内的所有元素进行异或操作。 通过这个"algorithm-code-csharp-master"压缩包,你可以学习...