问题:
[0, n-1]的数存在一个整数数组A[n]中,判断A中是否有重复元素,要求使用尽可能少的空间。
算法:(O(1)空间复杂度,O(n)时间复杂度)
一次遍历A,对于当前元素A[i],那么对数组中下标为A[i]的元素自减n。若无重复元素,那么一遍处理后,A[i] = A[i]-n,取值范围恰在[-1, -n]。所以对处理后的A一遍扫描,如果有正数说明有重复。
代码:
[0, n-1]的数存在一个整数数组A[n]中,判断A中是否有重复元素,要求使用尽可能少的空间。
算法:(O(1)空间复杂度,O(n)时间复杂度)
一次遍历A,对于当前元素A[i],那么对数组中下标为A[i]的元素自减n。若无重复元素,那么一遍处理后,A[i] = A[i]-n,取值范围恰在[-1, -n]。所以对处理后的A一遍扫描,如果有正数说明有重复。
代码:
- bool check_dup(int A[], int N){
- bool dup = false;
- for (int i=0; i<N; ++i){
- A[(A[i]%N+N)%N] -= N;
- }
- for (int i=0; i<N; ++i){
- if (A[i]>0){
- dup = true; break;
- }
- }
- for (int i=0; i<N; ++i)
- A[(A[i]%N+N)%N] += N;
- return dup;
- }