user-0 提问: 要将时间复杂度控制在O(N)以内！！

回复:
user: user-0
content: 引用 44 楼 SleekStone 的回复:[quote=引用 43 楼 是疗伤烧肉粽~ 的回复:][quote=引用 37 楼 SleekStone 的回复:][quote=引用 35 楼 是疗伤烧肉粽~ 的回复:][quote=引用 30 楼 SleekStone 的回复:][quote=引用 27 楼 是疗伤烧肉粽~ 的回复:]nullptr是什么？怎么没定义就冒出来？？？ [quote=引用 23 楼 SleekStone 的回复:]int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }[/quote]你要编不过可以用NULL或者0替换[/quote]编译错误，是用c语言的，不能用c++，换了也过不了[/quote]怎么可能，nullptr的地方都用0替换，不应该编不过啊[/quote]就是pResult = new int[N];这句过不了[/quote]用这个试试：int* fun(int *d, int N) {     int *pResult = 0;        if (0 != d && 0 < N)     {         int nTemp[101] = { 0 };         for (int i = 0; i < N; i++)         {             ++nTemp[d[i]];         }            int nTotalCount = 0;         for (int i = 100; i > -1; i--)         {             int nCurrent = nTemp[i];             nTemp[i] = nTotalCount;             nTotalCount += nCurrent;             if (nTotalCount == N)             {                 break;             }         }            pResult = (int*)malloc(sizeof(int) * N);         for (int i = 0; i < N; i++)         {             pResult[i] = nTemp[d[i]];         }     }        return pResult; }[/quote]行了，都过了

user: user-1
content: 引用 28 楼 是疗伤烧肉粽~ 的回复:[quote=引用 24 楼 早打大打打核战争 的回复:][quote=引用 17 楼 是疗伤烧肉粽~ 的回复:]还是运行超时了，要O(N)才行 [quote=引用 15 楼 早打大打打核战争 的回复:]稍微优化一下：  #include <stdio.h> #include <stdlib.h>  int *fun(int *d, int N) {   int b[2][101] = {0};   int *r = (int *)malloc(sizeof(int) * N);    for (int i = 0; i < N; i++) b[0][d[i]]++;   for (int i = 99; i >= 0; i--) b[1][i] = b[0][i + 1] + b[1][i + 1];   for (int i = 0; i < N; i++) r[i] = b[1][d[i]];    return r; }  int main() {   int n, *buf, *buf2;    scanf("%d", &n);   buf = (int *)malloc(sizeof(int) * n);   for (int i = 0; i < n; i++) scanf("%d", &buf[i]);   buf2 = fun(buf, n);   for (int i = 0; i < n; i++)     printf("%c%d", i ? ',' : '{', buf2[i]);   printf("}\n");   free(buf), free(buf2);    return 0; } [/quote]  这个就是O(N)的，而且在O(N)算法中也属于比较优化的，如果还超时，应该是他卡内存分配和I/O时间了，可以改成静态分配（OJ程序是判断不出来动态申请还是静态分配的~） [/quote]能不能简单说一下思路，这代码我看不太懂，谢谢[/quote]  这三行：   for (int i = 0; i < N; i++) b[0][d[i]]++;   for (int i = 99; i >= 0; i--) b[1][i] = b[0][i + 1] + b[1][i + 1];   for (int i = 0; i < N; i++) r[i] = b[1][d[i]]; 第一行统计0~100分每个得分的人数，第三行把超过每个得分的人数写回数组，不必多说。 第二行，因为题目假定分数在0~100，所以超过100的肯定没有，就不计算了（已经预置为0）。超过99的显然就是100分的人数，超过98的就是99+100的人数... 于是得到递推公式：超过x分的人数就是x+1分的人数加上超过x+1的人数（好像是废话啊），从99逆推到0就得到超过每个得分的人数

user: user-2
content: 评估角度：一个算法通常有最理想情况、平均情况、最糟糕情况，我们一般只考虑最糟糕情况 f(n)：一个算法运行的精确次数，如上面的例子，数据集合的大小为n, 则f(n) = 3n + 3 O(f(n))：精确次数===>渐进次数，因为我们通常考虑n趋于无穷大的情况，具体的规则如下： 当f(n)为常数时，如f(n) = 10，则O(f(n)) = O(10) = O(1) 当f(n)为多项式时，只取最高阶项，如f(n) = 2 n 2 + n + 3 2n^2 + n + 32n  2  +n+3，则O(f(n)) = O(2 n 2 2n^22n  2  ) 当f(n)有乘常数，则去除常数，如f(n) = 2 n 2 2n^22n  2  ，则O(f(n)) = O(n 2 n^2n  2  ) 什么是时间复杂度：一个算法运行所需要的时间，但不同的服务器所需的时间不同，通常采用一个算法运行的渐进次数来表示，即T(n)，n是数据集合的大小，表示公式为T(n) = O(f(n)) ———————————————— 版权声明：本文为CSDN博主「Bulut0907」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。 原文链接：https://blog.csdn.net/yy8623977/article/details/109813724

user: user-3
content: 好厉害的样子

user: user-4
content: 引用 27 楼 是疗伤烧肉粽~ 的回复:nullptr是什么？怎么没定义就冒出来？？？ [quote=引用 23 楼 SleekStone 的回复:]int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }[/quote]我想知道这种算法能通过测试不，试一下告诉我结果

user: user-4
content: 引用 27 楼 是疗伤烧肉粽~ 的回复:nullptr是什么？怎么没定义就冒出来？？？ [quote=引用 23 楼 SleekStone 的回复:]int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }[/quote]你要编不过可以用NULL或者0替换

user: user-4
content: 引用 43 楼 是疗伤烧肉粽~ 的回复:[quote=引用 37 楼 SleekStone 的回复:][quote=引用 35 楼 是疗伤烧肉粽~ 的回复:][quote=引用 30 楼 SleekStone 的回复:][quote=引用 27 楼 是疗伤烧肉粽~ 的回复:]nullptr是什么？怎么没定义就冒出来？？？ [quote=引用 23 楼 SleekStone 的回复:]int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }[/quote]你要编不过可以用NULL或者0替换[/quote]编译错误，是用c语言的，不能用c++，换了也过不了[/quote]怎么可能，nullptr的地方都用0替换，不应该编不过啊[/quote]就是pResult = new int[N];这句过不了[/quote]用这个试试：int* fun(int *d, int N) {     int *pResult = 0;        if (0 != d && 0 < N)     {         int nTemp[101] = { 0 };         for (int i = 0; i < N; i++)         {             ++nTemp[d[i]];         }            int nTotalCount = 0;         for (int i = 100; i > -1; i--)         {             int nCurrent = nTemp[i];             nTemp[i] = nTotalCount;             nTotalCount += nCurrent;             if (nTotalCount == N)             {                 break;             }         }            pResult = (int*)malloc(sizeof(int) * N);         for (int i = 0; i < N; i++)         {             pResult[i] = nTemp[d[i]];         }     }        return pResult; }

user: user-0
content: 引用 37 楼 SleekStone 的回复:[quote=引用 35 楼 是疗伤烧肉粽~ 的回复:][quote=引用 30 楼 SleekStone 的回复:][quote=引用 27 楼 是疗伤烧肉粽~ 的回复:]nullptr是什么？怎么没定义就冒出来？？？ [quote=引用 23 楼 SleekStone 的回复:]int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }[/quote]你要编不过可以用NULL或者0替换[/quote]编译错误，是用c语言的，不能用c++，换了也过不了[/quote]怎么可能，nullptr的地方都用0替换，不应该编不过啊[/quote]就是pResult = new int[N];这句过不了

user: user-4
content: 引用 35 楼 是疗伤烧肉粽~ 的回复:[quote=引用 30 楼 SleekStone 的回复:][quote=引用 27 楼 是疗伤烧肉粽~ 的回复:]nullptr是什么？怎么没定义就冒出来？？？ [quote=引用 23 楼 SleekStone 的回复:]int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }[/quote]你要编不过可以用NULL或者0替换[/quote]编译错误，是用c语言的，不能用c++，换了也过不了[/quote]int* fun(int *d, int N) {     int *pResult = 0;       if (0 != d && 0 < N)     {         int nTemp[101] = { 0 };         for (int i = 0; i < N; i++)         {             ++nTemp[d[i]];         }           int nTotalCount = 0;         for (int i = 100; i > -1; i--)         {             int nCurrent = nTemp[i];             nTemp[i] = nTotalCount;             nTotalCount += nCurrent;             if (nTotalCount == N)             {                 break;             }         }           pResult = (int*)malloc(sizeof(int) * N);         for (int i = 0; i < N; i++)         {             pResult[i] = nTemp[d[i]];         }     }       return pResult; }

user: user-4
content: 引用 40 楼 forever74 的回复:[quote=引用 37 楼 SleekStone 的回复:]怎么可能，nullptr的地方都用0替换，不应该编不过啊  new是++范儿。[/quote]啊.....好吧...

user: user-5
content: 引用 37 楼 SleekStone 的回复:怎么可能，nullptr的地方都用0替换，不应该编不过啊  new是++范儿。

user: user-1
content: new是c++运算符，需要改成malloc，你可能没注意到楼主发的是c语言版

user: user-6
content: 引用 37 楼 SleekStone 的回复:[quote=引用 35 楼 是疗伤烧肉粽~ 的回复:][quote=引用 30 楼 SleekStone 的回复:][quote=引用 27 楼 是疗伤烧肉粽~ 的回复:]nullptr是什么？怎么没定义就冒出来？？？ [quote=引用 23 楼 SleekStone 的回复:]int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }[/quote]你要编不过可以用NULL或者0替换[/quote]编译错误，是用c语言的，不能用c++，换了也过不了[/quote]怎么可能，nullptr的地方都用0替换，不应该编不过啊[/quote]  还有 new 呢...  多少为这楼主感到可惜

user: user-4
content: 引用 35 楼 是疗伤烧肉粽~ 的回复:[quote=引用 30 楼 SleekStone 的回复:][quote=引用 27 楼 是疗伤烧肉粽~ 的回复:]nullptr是什么？怎么没定义就冒出来？？？ [quote=引用 23 楼 SleekStone 的回复:]int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }[/quote]你要编不过可以用NULL或者0替换[/quote]编译错误，是用c语言的，不能用c++，换了也过不了[/quote]怎么可能，nullptr的地方都用0替换，不应该编不过啊

user: user-0
content: 引用 33 楼 早打大打打核战争 的回复:[quote=引用 28 楼 是疗伤烧肉粽~ 的回复:][quote=引用 24 楼 早打大打打核战争 的回复:][quote=引用 17 楼 是疗伤烧肉粽~ 的回复:]还是运行超时了，要O(N)才行 [quote=引用 15 楼 早打大打打核战争 的回复:]稍微优化一下：  #include <stdio.h> #include <stdlib.h>  int *fun(int *d, int N) {   int b[2][101] = {0};   int *r = (int *)malloc(sizeof(int) * N);    for (int i = 0; i < N; i++) b[0][d[i]]++;   for (int i = 99; i >= 0; i--) b[1][i] = b[0][i + 1] + b[1][i + 1];   for (int i = 0; i < N; i++) r[i] = b[1][d[i]];    return r; }  int main() {   int n, *buf, *buf2;    scanf("%d", &n);   buf = (int *)malloc(sizeof(int) * n);   for (int i = 0; i < n; i++) scanf("%d", &buf[i]);   buf2 = fun(buf, n);   for (int i = 0; i < n; i++)     printf("%c%d", i ? ',' : '{', buf2[i]);   printf("}\n");   free(buf), free(buf2);    return 0; } [/quote]  这个就是O(N)的，而且在O(N)算法中也属于比较优化的，如果还超时，应该是他卡内存分配和I/O时间了，可以改成静态分配（OJ程序是判断不出来动态申请还是静态分配的~） [/quote]能不能简单说一下思路，这代码我看不太懂，谢谢[/quote]  这三行：   for (int i = 0; i < N; i++) b[0][d[i]]++;   for (int i = 99; i >= 0; i--) b[1][i] = b[0][i + 1] + b[1][i + 1];   for (int i = 0; i < N; i++) r[i] = b[1][d[i]]; 第一行统计0~100分每个得分的人数，第三行把超过每个得分的人数写回数组，不必多说。 第二行，因为题目假定分数在0~100，所以超过100的肯定没有，就不计算了（已经预置为0）。超过99的显然就是100分的人数，超过98的就是99+100的人数... 于是得到递推公式：超过x分的人数就是x+1分的人数加上超过x+1的人数（好像是废话啊），从99逆推到0就得到超过每个得分的人数 [/quote]懂了，谢谢，代码过了

user: user-0
content: 引用 30 楼 SleekStone 的回复:[quote=引用 27 楼 是疗伤烧肉粽~ 的回复:]nullptr是什么？怎么没定义就冒出来？？？ [quote=引用 23 楼 SleekStone 的回复:]int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }[/quote]你要编不过可以用NULL或者0替换[/quote]编译错误，是用c语言的，不能用c++，换了也过不了

user: user-1
content: 引用 26 楼 是疗伤烧肉粽~ 的回复:引用 25 楼 早打大打打核战争 的回复:另，他的OJ是要提交整个程序还是只要一个函数？只要一个函数  改成静态分配：  int *fun(int *d, int N) {   int b[2][101] = {0};   //int *r = (int *)malloc(sizeof(int) * N);   static int r[1048576];    for (int i = 0; i < N; i++) b[0][d[i]]++;   for (int i = 99; i >= 0; i--) b[1][i] = b[0][i + 1] + b[1][i + 1];   for (int i = 0; i < N; i++) r[i] = b[1][d[i]];    return r; }

user: user-4
content: int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }

user: user-0
content: 引用 24 楼 早打大打打核战争 的回复:[quote=引用 17 楼 是疗伤烧肉粽~ 的回复:]还是运行超时了，要O(N)才行 [quote=引用 15 楼 早打大打打核战争 的回复:]稍微优化一下：  #include <stdio.h> #include <stdlib.h>  int *fun(int *d, int N) {   int b[2][101] = {0};   int *r = (int *)malloc(sizeof(int) * N);    for (int i = 0; i < N; i++) b[0][d[i]]++;   for (int i = 99; i >= 0; i--) b[1][i] = b[0][i + 1] + b[1][i + 1];   for (int i = 0; i < N; i++) r[i] = b[1][d[i]];    return r; }  int main() {   int n, *buf, *buf2;    scanf("%d", &n);   buf = (int *)malloc(sizeof(int) * n);   for (int i = 0; i < n; i++) scanf("%d", &buf[i]);   buf2 = fun(buf, n);   for (int i = 0; i < n; i++)     printf("%c%d", i ? ',' : '{', buf2[i]);   printf("}\n");   free(buf), free(buf2);    return 0; } [/quote]  这个就是O(N)的，而且在O(N)算法中也属于比较优化的，如果还超时，应该是他卡内存分配和I/O时间了，可以改成静态分配（OJ程序是判断不出来动态申请还是静态分配的~） [/quote]能不能简单说一下思路，这代码我看不太懂，谢谢

user: user-0
content: nullptr是什么？怎么没定义就冒出来？？？ 引用 23 楼 SleekStone 的回复:int* fun(int *d, int N) { 	int *pResult = nullptr;  	if (nullptr != d && 0 < N) 	{ 		int nTemp[101] = { 0 }; 		for (int i = 0; i < N; i++) 		{ 			++nTemp[d[i]]; 		}  		int nTotalCount = 0; 		for (int i = 100; i > -1; i--) 		{ 			int nCurrent = nTemp[i]; 			nTemp[i] = nTotalCount; 			nTotalCount += nCurrent; 			if (nTotalCount == N) 			{ 				break; 			} 		}  		pResult = new int[N]; 		for (int i = 0; i < N; i++) 		{ 			pResult[i] = nTemp[d[i]]; 		} 	}  	return pResult; }