一道看上去很吓人的算法题 【微软面试去100题 第四十九题】
题目要求:
如何对n个数进行排序,要求时间复杂度O(N).空间复杂度为O(1).
题目分析:
严格的说,这道题给出的条件不全。如果这n个数字的大小跨度很大(1~无穷大),则肯定达不到要求。
如果n个数字的大小在一定范围内(如0~65535),则可以用hash表的方法。定义为int hash[65536],占用的内存空间固定为sizeof(int)*65536,则空间复杂度为O(1).
那么怎么时间复杂度为O(N)呢?即可以遍历几遍数组就可以排序完成。实际上我们可以遍历一遍数组,再遍历一遍hash空间就可以输出排序后的结果。
下面举个例子,为了简化起见,假设所有的数字都在0~10之间,则定义int hash[10],并初始化hash[0~9]=0;
令原数组的n个数为:{7,4,3,4,7,2,1,9}.
第一遍遍历数组,每次都进行hash[a[i]]++处理,这样结果是hash[7]=2,hash[3]=1....
第二遍遍历hash数组,从hash[0]~hash[9],当hash[i] = x时,连续输出x个i。这样最后输出的结果就是1 2 3 4 4 7 7 9.
时间复杂度为O(N).空间复杂度为O(1).done....
代码实现:
#include <iostream> using namespace std; const int N = 8; const int HASH_SPACE = 65536; void Sort(int a[],int n,int hash[]); int main(void) { int a[N] = {7,4,3,4,7,2,1,9}; int hash[HASH_SPACE] = {0}; Sort(a,N,hash); return 0; } void Sort(int a[],int n,int hash[]) { for(int i=0;i<n;i++) { hash[a[i]]++; } for(int i=0;i<HASH_SPACE;i++) { while(hash[i]) { cout << i << " "; hash[i]--; } } cout << endl; }
很多时候不是我们做不好,而是没有竭尽全力......
分类:
【微软面试100题】
posted on 2014-11-08 22:20 tractorman 阅读(225) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?