| |||
| 把A[i]和A[A[i]]交换如何? C++ 代码:
PS: 这段代码是错的,谁高兴挑一下,用肉眼比较娱乐 呵呵 |
| |||
| 引用:
这个方法和你的计数的方法是一样的 你的计数的方法用了一个数组 完全可以省去多用的空间 只要你按照同样的方式用原来数组的空间来计数 当然细节方面要做点修改 在原代码return false的地方改为计数 而且计数的1用N+1开始,保证不会与原来数组的1~N重复 |
| |||
| 引用:
由于遍历了一遍数组,还有N次操作 所以复杂度为O(N) 正确性证明 1、若没有重复 a[a[i]] == a[i]永远不会成立,所以程序可以返回true 2、若有重复 不妨设a[p] = a[q] = k,由于每个元素至少访问一次(由外层的for可以保证),不妨设先访问访问a[p],要么返回false要么设a[k] = k,那么访问a[q]的时候一定会满足a[a[q]] == a[q]的条件,使得返回false 3、最后证明一下不可能死循环,实际上由复杂度为O(N)的证明就可以得出 |
| |||
| 可修改原数组的计数 时间O(n)、空间O(1) c++ 代码:
|
| |||
| 等差数列的和公式是:(首项 + 末项) * 项数 / 2 1到N的和则为N*(N + 1) / 2 下面证明N*(N + 1) / 2这个值在N个数中,只能是N个互不相同的数的和,1<=每一个数<=N 这个证明省略,用数学归纳法一下就能出来。 证明了上面,也就说明,1、2、3……N之和必为N*(N + 1) / 2,而N*(N + 1) / 2必为1、2、3……N之和。 根据题目已知条件,1 <= a[i] <= N 将数组求和,与N*(N + 1) / 2比较,不等则说明有重复。(这里又是个证明,妈d,没办法,力求严谨,如果不等又不重复,说明,a[i]只能是从1到N,而从1到N的和只能是N*(N + 1) / 2,矛盾。所以,如果和不等于N*(N + 1) / 2,说明必定有数字重复) 空间复杂度O(1),时间复杂度O(N)-〉求和 #include <vector> using namespace std; static const unsigned int N = 100; bool IsNumberDuplicate(const vector<int>& array) { int i = 0; int sum = 0; while (i++ < N) { sum += array[i]; } if (sum != (1 + N) * N / 2) { return true; } return false; } |
| |||
| 引用:
引用:
|