前言
做了一道笔试题,要求对时间复杂度为O(n),空间复杂度为O(1)的数组排序,被空间复杂度O(1)搞得有点懵。
原题中O(1)只是表示的额外空间与n无关!!!原题中数组大小n是不确定的,但是元素种类只有0,1,2三种,是一个常量,所以我们可以另外开辟一个大小为3的常量数组(hashtable)来记录每种元素出现的次数,并且hashtable[nums[i]]++亦能够对原数组进行排序,最后按照hashtable元素的顺序和次数输出即可。但是它由于新开辟的数组是大小常量,并不影响空间复杂度,故空间复杂度O(1).
1.引入库
代码如下(示例):
#include<iostream>
#include<vector>
using namespace std;
vector<int> Sort(vector<int>& nums, int nsize) {
const int numsmax = 3;
int hashtable[numsmax];
for (int i = 0; i < numsmax; i++) {
hashtable[i] = 0;
}
for (int i = 0; i < nsize; i++) {
hashtable[nums[i]]++;
}
int k = 0;
for (int j = 0; j < numsmax; j++) {
if (hashtable[j] != 0)
{
while (hashtable[j]--)
{
nums[k] = j;
k++;
}
}
}
return nums;
}
int main() {
vector<int> nums = { 2,2,1,0,2,1 };
int nsize = nums.size();
Sort(nums, nsize);
for (int i = 0; i < nsize-1; i++) {
cout << nums[i] << ",";
}
cout << nums[nsize - 1];
}