避免算法竞赛超时小技巧

避免算法竞赛超时小技巧


虽然大家用的都是同样的思想,同样的算法,但是如果你在算法比赛在不注意这些小细节的话,将会大大的增加你程序的执行时间,增加甚至是将你算法程序的时间复杂度提升一个量级!

1. 在for循环的判断条件中使用求长度/大小的函数
  很多小伙伴们在写for()循环的时候,喜欢在判断条件,但是这种方法看似让你省写了一个length变量,但是却让你的程序慢了许多。例如我们以下面两段程序为例:
第一段:

int[] demo = new int[n];
int length = demo.length();
for (int i = 0; i < length; ++i) {
   do something;
}

第二段:

int[] demo = new int[n];
for (int i = 0; i < demo.length(); ++i) {
   demo[i]++;
}

虽然第一段程序多写了一行,使用了一个变量length,但是第一段程序却要比第二段程序的效率要高得多(这里提高了30%+的效率),有时候并不是说程序短,执行效率就高。

2. 复杂的式子多次使用,赋值给变量
  很多时候,可能一个复杂的计算我们需要进行多次的判断,赋值等操作,这个时候一定不要舍不得声明一个新变量将它赋值,用变量来代替重复的计算。例如下面的代码:

if(min(max_right[i],max_left[i]) - height[i] > 0)
	ans = ans + min(max_right[i],max_left[i]) - height[i];

我们可以优化为:

int temp = min(max_right[i],max_left[i]) - height[i];
ans += temp > 0 ? temp : 0;

程序段的意思不变,但是执行想效率却要高了很多,尤其是在多次使用的时候。

3. 判断奇偶数的时候,使用’&'更高效
  在判断一个数的奇数还是偶数的时候,很多小伙伴会使用%来求一个数除以2的余数来进行判断,其实这里我们有更高效的方法,那就是&与运算,如果a&1 == 1则a为奇数,a&1 == 0则a为偶数

4. 能转换为迭代的函数,尽量不要写递归

5. 算法最高不要超过O(n^2)
  在我们正常的算法竞赛中,当你写出来一个时间复杂度比O(n2)的算法时,那你这题基本是凉透了,或者说你只想拿前两个样例(如果是按测试点的比赛,如果实在想不出来,最后可以写个完全暴力,能骗几分是几分)。一般来说,时间效率到O(n 2)一般都很高了,已经很难过全部样例了,如果是压轴题的话,O(n)算法都比较难过全部样例,得需要优化到O(lgn)才保险。

  • 20
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值