算法时间复杂度与空间复杂度

  1. 概念

在写算法时不能只考虑能否解决问题,时间复杂度和空间复杂度也应考虑在内。

  • 时间复杂度是指算法执行时的速度,时间复杂度越低,执行速度越快,这点尤为重要;而空间复杂度则是算法需要消耗的内存大小,当然也是越小越好,优化算法就是朝着高效率低内存而去的。

时间复杂度:

比如   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.例题

1732. 找到最高海拔

有一个自行车手打算进行一场公路骑行,这条路线总共由 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中的最大值;

  • 
    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;
    }
    
    ​
    
    ​
    函数中的*gain是传入的数组代表净海拔高度差,而gainSize是数组的长度;

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

  • 这样就省去了一个数组的内存,速度也相应提高了。

南昌理工学院集训队

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值