在O(n)时间复杂度O(1)空间复杂度求一个数组中出现多次和未出现的数字
来源:互联网 发布:软件培训要好多钱 编辑:程序博客网 时间:2024/05/21 06:58
爱奇艺笔试题:
原题是:已知一个数组A[],大小为N,其中每个数都为1~N,请求出该数组中未出现的数字和出现多次的数字。
要求是时间复杂度为O(N),空间复杂度为O(1)
这道题的关键点就在于空间复杂度为O(1),本来想到的2-bitmap因为这点也不能实现了。
解法一:
这是我自己考试时想到的,利用每个数都为1~N的特点,可以将A[I]与A[A[I] - 1]进行交换,一直到无法交换为之。交换过后,如果为重复则将该数置为-1,如果未出现则置为0.
这种方法边界条件较为复杂,很难在考场上写的尽善尽美。
分析复杂度,交换次数将不会超过N,而比较次数稍多,但也不会超过2N。因此总体可以认为时间复杂度依然在O(N)的范围。
代码如下:
void appears1(int r[], int n) {int i;for (i = 0; i < n; ++i) {if (r[i] == i + 1 || r[i] == -1 || r[i] == 0)continue;else if (r[i] == r[r[i] - 1]) {r[r[i] - 1] = -1;r[i] = 0;} else if (r[r[i] - 1] == -1)r[i] = 0;else {int j = i;while (r[j] != 0 && r[j] != r[r[j] - 1] && r[r[j] - 1] != -1)swap(r[j], r[r[j] - 1]);if (r[j] != j + 1) {r[r[j] - 1] = -1;r[j] = 0;}}}cout << "未出现的数字为: ";for (i = 0; i < n; ++i)if (r[i] == 0)cout << i + 1 << " ";cout << endl;cout << "出现多次数字为: ";for (i = 0; i < n; ++i)if (r[i] == -1)cout << i + 1 << " ";cout << endl;}
解法二:
强烈值得注意!
啥都不说了,直接看代码吧。提示是:要善于利用%操作符
void appears(int r[], int n) {int i;for (i = 0; i < n; ++i)r[(r[i] - 1) % n] += n;cout << "未出现的数字为: ";for (i = 0; i < n; ++i)if ((r[i] - 1) / n == 0)cout << i + 1 << " ";cout << endl;cout << "出现多次数字为: ";for (i = 0; i < n; ++i)if ((r[i] - 1) / n > 1)cout << i + 1 << " ";cout << endl;}
第二种方法不管简易性还是出错率还是易读性完爆我自己的第一种方法有木有!!!
- 在O(n)时间复杂度O(1)空间复杂度求一个数组中出现多次和未出现的数字
- 在O(n)时间复杂度O(1)空间复杂度求一个数组中出现多次和未出现的数字
- 数组中未出现的最小正整数(时间复杂度O(N),空间复杂度O(1))
- 找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。
- 数组中只出现一次的数字,时间复杂度O(n),空间复杂度O(1)的解法
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字
- 统计数组中每个元素出现的个数,时间复杂度 O(n),空间 O(1)
- 如何快速找出一个数组中只出现一次的两个数,其他元素出现两次?保证时间复杂度O(n),空间复杂度O(1)
- 返回数组中任意某个重复的数字--时间复杂度O(n)空间复杂度O(1)
- 统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))
- 统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))
- 统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- 将数组排序,数组中所有的负整数出现在正整数前面(时间复杂度为 O(n), 空间复杂度为 O(1)).
- 如何在时间复杂度为O(n),空间复杂度为O(1)的条件下,统计数组中不同元素出现的次数
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n), 空间复杂度是O(1)
- 一个数组,有一个数出现3次,其余出现2次,求出现3次的数,要求时间复杂度<nlogn,空间复杂度O(1)
- 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 时间复杂度O(N) 空间复杂度O(N)
- poj 1002 487-3279
- C++库研究笔记——#if #elif 的错误使用
- 逆序数递归算法
- qsort
- FreeMaker教程
- 在O(n)时间复杂度O(1)空间复杂度求一个数组中出现多次和未出现的数字
- 8招让你更沉稳
- nginx图片缓存
- ATL7窗口类详细剖析
- 4.8
- [Mac]GCC,LLVM,Clang编译器对比
- 2013年9月28日17:54:59 code ··· merge sort ····
- 关于 写代码 2013年9月28日18:22:43
- 算法导论公开课对应章节(来自MIT)