- 概念
在写算法时不能只考虑能否解决问题,时间复杂度和空间复杂度也应考虑在内。
- 时间复杂度是指算法执行时的速度,时间复杂度越低,执行速度越快,这点尤为重要;而空间复杂度则是算法需要消耗的内存大小,当然也是越小越好,优化算法就是朝着高效率低内存而去的。
时间复杂度:
比如 for(i=0;i<n;i++) 这条语句;i 循环了n次,那么它的时间复杂度就是O(n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
a++;
}
而这个循环了n*n次,那么它的时间复杂度就为O(n*n);
空间复杂度:
- 在程序中也需要分配内存,设置的每个变量都是要消耗内存的,而数组则会消耗更多内存;
2.例题
有一个自行车手打算进行一场公路骑行,这条路线总共由 n + 1
个不同海拔的点组成。自行车手从海拔为 0
的点 0
开始骑行。
给你一个长度为 n
的整数数组 gain
,其中 gain[i]
是点 i
和点 i + 1
的 净海拔高度差(0 <= i < n
)。请你返回 最高点的海拔 。
示例 1:
输入:gain = [-5,1,5,0,-7] 输出:1 解释:海拔高度依次为 [0,-5,-4,1,1,-6] 。 最高海拔为 1 。
方法一:
动态分配另一个数组high 储存海拔高度,high[0]为0,最后返回数组high中的最大值;
-
函数中的*gain是传入的数组代表净海拔高度差,而gainSize是数组的长度;int largestAltitude(int* gain, int gainSize){ int *hash=calloc(gainSize+1,4); //分配内存给数组hash; hash[0]=0; for(int i=1,j=0;j<gainSize;i++,j++) { hash[i]=hash[i-1]+gain[j]; //两个海拔高度相减为高度差; } int max=hash[0]; for(int i=1;i<gainSize+1;i++) { if(max<hash[i])max=hash[i]; //找出最大值 } return max; }
max则是返回的最大海拔高度。
执行用时: 4 ms
内存消耗: 5.9 MB
很明显,可以再进行优化;
在输入n给数后,找出它们的最大值其实并不用储存到数组,在每次输入后就跟max比较大小就行;
优化后:
int largestAltitude(int* gain, int gainSize){
int max=0;
int n=0;
for(int i=0;i<gainSize;i++)
{
max=fmax(max,n+gain[i]);
n+=gain[i];
}
return max;
}
执行用时: 0 ms
内存消耗: 5.7 MB
- 这样就省去了一个数组的内存,速度也相应提高了。
南昌理工学院集训队