-
为什么同样的算法,你的程序却一直超时? 算法竞赛你不得不知道的小技巧
2020-04-05 15:39:25不知道大家有没有经常遇到这样的一个困扰,为什么同样的...大家用的都是暴力大法,为什么别人的能过所有数据,而你的却只能过前几个样例;同样都是使用dp,为什么你的比别人的慢了那么多,有时候最后一个测试点都超时!为什么同样的算法,你的程序却一直超时? 算法竞赛你不得不知道的小技巧
大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,一起加油吧~
不知道大家有没有经常遇到这样的一个困扰,为什么同样的算法,你的程序却一直超时?大家用的都是暴力大法,为什么别人的能过所有数据,而你的却只能过前几个样例;同样都是使用dp,为什么你的比别人的慢了那么多,有时候最后一个测试点都超时!
虽然大家用的都是同样的思想,同样的算法,但是如果你在算法比赛在不注意这些小细节的话,将会大大的增加你程序的执行时间,增加甚至是将你算法程序的时间复杂度提升一个量级!下面博主整理了一些算法比赛中十分常用的一些小细节,快看看你有没有中招!1. 在for循环的判断条件中使用求长度/大小的函数
很多小伙伴们在写for()循环的时候,喜欢在判断条件,但是这种方法看似让你省写了一个length变量,但是却让你的程序慢了许多。例如我们以下面两段程序为例:
第一段:#include <iostream> #include <ctime> #include <vector> using namespace std; int main(){ vector<int> demo; for (int i = 0; i < 100000; ++i) { demo.push_back(i); } int length = demo.size(); clock_t startTime = clock(); for (int i = 0; i < length; ++i) { demo[i]++; } clock_t endTime = clock(); cout<<"执行用时: "<<(endTime - startTime)<<endl; return 0; }
#include <iostream> #include <ctime> #include <vector> using namespace std; int main(){ vector<int> demo; for (int i = 0; i < 100000; ++i) { demo.push_back(i); } clock_t startTime = clock(); for (int i = 0; i < demo.size(); ++i) { demo[i]++; } clock_t endTime = clock(); cout<<"执行用时: "<<(endTime - startTime)<<endl; return 0; }
这里面第一段程序运行输出的是
执行用时: 278
,第二段程序运行的输出为执行用时: 401
,大家看一下这两段程序,虽然第一段程序多写了一行,使用了一个变量length,但是第一段程序却要比第二段程序的效率要高得多(这里提高了30%+的效率
),有时候并不是说程序短,执行效率就高。2.复杂的式子多次使用,赋值给变量
这个情况也很常见了,在我们很多时候,可能一个复杂的计算我们需要进行多次的判断,赋值等操作,这个时候一定不要舍不得声明一个新变量将它赋值,用变量来代替重复的计算。例如下面的代码:
本文原创为CSDN博主亓官劼,原文链接为:为什么同样的算法,你的程序却一直超时? 算法竞赛你不得不知道的小技巧,请大家支持原创,拒绝抄袭。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.能转换为迭代的函数,尽量不要写递归
很多小伙伴们习惯写递归函数,确实递归函数比较好构思,好写出程序出来,但是递归函数的时间复杂度和空间复杂度是非常大的,非常容易超时,如果我们有时间并且有能力将它转换为迭代的话,我们还是使用迭代会比较好,时间和空间上会节省很多。
本文原创为CSDN博主亓官劼,原文链接为:为什么同样的算法,你的程序却一直超时? 算法竞赛你不得不知道的小技巧,请大家支持原创,拒绝抄袭。5.学会以空间换时间
在算法竞赛中,我们一般会经常超出时间限制,但是超出空间限制的还是很少的,一般比赛给的都是16MB甚至256MB,根本用不完啊,而且多开几个数组也完全的占不了几个字节,但是这能让我们的程序节省上百倍的时间。这里就拿昨天写的一题来举例吧:LeetCode 每日一题 42. 接雨水,原文有具体的题目和代码,这里为了方便,我们把两段代码分别拿过来。
第一段代码,完全暴力:class Solution { public: int trap(vector<int>& height) { int ans = 0; int length = height.size(); int max_left,max_right; for(int i = 0; i< length; i++){ max_left = max_right = 0; //找到左面的最高值 for(int j = i; j >= 0; j--){ if(height[j] > max_left) max_left = height[j]; } //找到右面的最高值 for(int j = i; j < length; j++){ if(height[j] > max_right) max_right = height[j]; } // 当前柱面能够接的雨水为:左右两名最高值的低值,然后减去当前柱面的高度 ans += min(max_right,max_left) - height[i]; } return ans; } };
第二段程序,在第一段的基础上使用了打表:
class Solution { public: int trap(vector<int>& height) { int ans = 0; int length = height.size(); //空vector时直接返回0 if(length == 0) return 0; int max_left[length],max_right[length]; //i = 0时,左面(含当前)最大值为height[0] max_left[0] = height[0]; for(int i = 1; i < length; i++){ //max_left[i] 赋值为当前柱面的高度和max_left[i-1]最大值 max_left[i] = max(height[i],max_left[i-1]); } //i = length -1 时,右面(含当前)最大值为height[length-1] max_right[length-1] = height[length-1]; for(int i = length-2; i >= 0; i--){ //max_right[i]赋值为当前柱面的值和max_right[i+1]的最大值 max_right[i] = max(height[i],max_right[i+1]); } for(int i = 0; i< length; i++){ // 当前柱面能够接的雨水为:左右两面最高值的低值,然后减去当前柱面的高度,赋值为temp int temp = min(max_right[i],max_left[i]) - height[i]; // 如果temp>0,则ans进行累加,否则加0 ans += temp > 0 ? temp : 0; } return ans; } };
然后我们这里再分别贴一下两端程序执行分别使用的时间,第一段程序使用了416ms:
第二段程序使用了4ms:
第一段程序使用的时间是第二段程序的104
倍,第二段程序使用的内存竟然还比第一段程序少了0.1MB,但是我们仔细看看两段程序的区别,我们的第二段程序仅仅是将第一段程序中每次遍历当前柱面是左右寻找的最高值,在一程序开始时使用一个数组记录下来,避免了后面的重复计算。仅仅是这2个小小的数组,就将这端程序的效率提高了104
倍,这里明明是使用空间换时间,结果第二段程序使用的空间反而更小,这就是这么神奇!
本文原创为CSDN博主亓官劼,原文链接为:为什么同样的算法,你的程序却一直超时? 算法竞赛你不得不知道的小技巧,请大家支持原创,拒绝抄袭。6.算法最高不要超过O(n^2)
在我们正常的算法竞赛中,当你写出来一个时间复杂度比O(n2)的算法时,那你这题基本是凉透了,或者说你只想拿前两个样例(`这里说一句,按测试点的比赛,如果实在想不出来,最后可以写个完全暴力,能骗几分是几分`)。我们一般来说,时间效率到O(n 2)一般都很高了,已经很难过全部样例了,如果是压轴题的话,O(n)算法都比较难过全部样例,得需要优化到O(lgn)才保险。所以我们一般在写的时候就要注意我们的一个大致的时间复杂度,别让自己绞尽脑汁写出来的程序,结果到最后只过了前面的几个样例,我尽可能的降低时间复杂度,上面提供了5中常用的降低时间的小技巧,大家可以进行参考。一般来说O(n)的算法还是比较好写出来的,在训练的时候,自己写出来了也要多看看各个大神的解法,说不定会给你新的解题思路。
好了,本期就到这里,大家还有什么其他的小技巧也可以在评论区分享哦~
-
这4个小程序为什么有很多人在用,仅仅是因为不占手机内存空间?
2019-02-22 18:12:58现在小程序真是无处不在,各种类型的都有,小程序是很多没错,那APP也很多,为什么使用小程序的人越来越多,难道就难道仅仅是因为不占手机内存空间吗?原来不是,是因为下面这个4款小程序真的很实用。 1.小橘句子 ...现在小程序真是无处不在,各种类型的都有,小程序是很多没错,那APP也很多,为什么使用小程序的人越来越多,难道就难道仅仅是因为不占手机内存空间吗?原来不是,是因为下面这个4款小程序真的很实用。
1.小橘句子
一个温暖而静谧的字句社区
特点:
——分类繁多。只要是想看句子这里都是有的,树洞、名人、爱情、诗词、情书、励志等等,这里都应有尽有;
——随心所欲。可以认识人多的学者,也能将自己喜欢的内容以图文的方式进行分享。
2.歇后语词典
一个为你排忧解难的实用小工具
特点:
——界面简单。打开小程序,只有一个搜索栏,输入需要内容即可进行使用;
——歇后语繁多。搜索一个字,就可以出现超多的歇后语,有这个在,不知道的歇后语还用愁?
3.十点读书
一款伴你成长的听书软件
特点:
——陪你读书。深夜十点,精彩的美文,让你随心选择,在你孤单时,让它陪伴着你。
——课程清晰。各种课程分类,一目了然,名家经典、对话大咖、好书推荐,想看什么直接选择。
4.日常穿搭日记
一款帮你记录每天穿搭的生活日志
特点:
——任意搭配。在这个小程序中,有着多种风格漫画人物,可以根据自己当天的穿搭进行选择。
——完美记录。可以将你的表情、今天的兴趣都可以在这里进行记录下来,保存成图片,一路记载下来,让你看看自己成长变化。
以上就是今天的分享了,有什么疑问都可以在下方评论区进行留言,对于感兴趣的小程序也都可以试试。
-
为什么小程序图片预览会比实际的_小程序可视化制作教程:怎么用简易编辑工具...
2020-12-03 17:51:02简单来说,就是你对小程序的修改,页面搭建都是可以被即时看到的,所见即所得,不需要懂什么编程技术,小白也能凭借着这种小程序可视化开发工具快速生成一个自己的小程序。可视化制作是一种非常适合小白的方式,不过...什么是小程序可视化编辑?简单来说,就是你对小程序的修改,页面搭建都是可以被即时看到的,所见即所得,不需要懂什么编程技术,小白也能凭借着这种小程序可视化开发工具快速生成一个自己的小程序。
可视化制作是一种非常适合小白的方式,不过小白若想有个好的小程序效果,对于开发工具的选择还是要慎重。对于可视化小程序编辑器来说,至少应满足以下这些条件:
本展示页所提供的模板及元素仅供展示功能效果,未经授权不得应用于其他用途
(1)模板美观。好看的模板才能做出受访客喜欢的小程序,也能激起客户继续浏览的心情。
(2)操作简单,修改方便。如果操作太复杂,新手就会手忙脚乱,降低效率。
(3)预览效果真实可信。不能预览一个样,审核上线后另一个样。
具体该如何制作呢?接下来就跟大家分享下可视化小程序制作教程:
首先你需要找一个简单易懂的小程序可视化编辑工具,能让你在编辑小程序时随时预览效果,“上线了”就是如此,后台都是傻瓜式操作,直接选择“创建小程序”,再选一个模板,就能开始搭建小程序了。
这里我用电商模板给大家演示下可视化搭建过程。点击电商模板,进入小程序编辑器,在这里你可以设计小程序主题色、产品布局、分页导航;点击“页面设计”你可以添加各种版块,包括图片banner(轮播图、拼接图海报)、快捷按钮、标题、视频、商品分类等。
点击左侧【商店】栏,你可以添加新的商品,设置商品分类、配送服务、开启商品评论。点击【粉丝运营】,你可以在这里创建会员系统;【营销中心】里可以添加各种营销工具。
做好并预览无误后点击左下角“立即发布”,如果你没有小程序账号,那么就点击“注册小程序账号”-选择主营类目 - 快速注册,然后按要求填写好自己的相关信息,等待审核即可。
电商小程序演示效果
如果你已经提前在微信公众平台注册了小程序账号,那么就点击“已有小程序账号,前往授权”,用小程序管理员账号扫描授权就行。以上就是关于微信小程序可视化的工具选择、制作教程科普,是不是很简单?其实,这是一种对新手比较友好的方法了。
-
dvwa页面打不开的原因_微信小程序为什么打不开上线了小程序问答
2020-12-27 10:47:38在使用微信小程序过程中,有时候我们会遇到小程序打不开的情况。为什么微信小程序打不开呢?微信小程序打不开怎么办?下面就跟大家解答一下。1.小程序商家更换模板有些商家的小程序是使用小程序模板制作的,比如你...在使用微信小程序过程中,有时候我们会遇到小程序打不开的情况。为什么微信小程序打不开呢?微信小程序打不开怎么办?下面就跟大家解答一下。
1.小程序商家更换模板
有些商家的小程序是使用小程序模板制作的,比如你可以用「上线了」sxl.cn小程序模板来快速生成小程序。如果商家更换了模板,那么扫描原来的小程序码会出现无法打开的情况。你可以扫新的小程序码,就能顺利打开了。
本展示页所提供的模板及元素仅供展示功能效果,未经授权不得应用于其他用途
2.小程序违规被封
微信对于小程序的管理和要求是比较严格的。如果小程序被封,就不能再打开。被封的原因主要有这些:主体不符、用户投诉、刷单刷量、恶意诱导、其他违法行为等等。具体你可以查看微信官方文档。
如果是这种情况下打不开,需要商家按照微信规范,制作合乎规范的小程序,才能顺利打开。
3.运营者停止服务
如果小程序管理员停止了这个小程序的服务,用户将不可以正常访问小程序。这种情况下微信小程序打不开怎解决?想要恢复顺利打开的话,管理员只需在小程序后台的【设置-功能设置】里重新恢复服务就行。
4.网速太慢,或者手机卡顿
这也是常见现象,检查你的手机是不是内存紧张;或者网速出了问题。可以清理一下手机缓存、卸载不常用软件后,同时保证网速顺畅;再打开小程序基本就能正常运行了。
现在明白微信小程序怎么打不开了吗?如果发生这样的情况,你可以用上述方法排查一下哦!
点击下方“阅读原文”,用「上线了」制作一个自己的小程序试试吧!(电脑端操作更方便哦)「上线了sxl.cn」是一个专注自助建站与小程序开发的SaaS平台,针对众多行业提供多套小程序模板,帮助没有技术和设计基础的商家和创业者,目前已经有三百多万用户通过上线了一键生成网站和小程序,快速建立品牌、获取客户、经营生意。2019年8月入选腾讯SaaS加速器首期成员。
推荐阅读音乐网站的5个设计技巧
小程序页面搭建及美化教程
小程序中秋国庆营销活动方案
-
什么样的美食小程序能不会被时间淡忘
2019-09-05 15:34:01现在的小程序太多,为什么有的小程序能让人爱不离手?为什么有的用过一次后再也不想用了?随着时间的淡化,有的小程序就消失了。这些热门的小程序到底是有何种魅力吸引着大波的流量?一款小程序应该有什么样的功能才... -
微信小程序安卓手机隐藏键盘_5款优质的微信小程序,不占内存,安卓苹果都能用!...
2020-12-31 19:10:15小程序是大家都不陌生的,使用微信,就会或多或少都会用到一些,而且小程序涉及到了方方面面,但是也还是需要看我们需要的是什么,对吧,在众多的小程序中挑选出自己心仪的,还是需要花费一些时间的。为了让大家能够... -
为什么要做小程序?小程序对营销有什么作用?
2019-07-27 10:29:48小程序是一种不需要下载安装即可使用...与传统app相比,小程序无需安装、卸载,用完即走,触手可及,与用户不是粉丝关系,是访问关系,后台数据是微信标准化数据,不能自由选取。与应用商店相比,小程序没有应用商店... -
为什么每个公司都必须有小程序?
2020-08-31 11:04:35为什么小程序会这么火? 小程序作为腾讯和微信的战略级产品,得到了腾讯和微信强大的技术和市场资源的注入。 小程序的初衷不是替代所有APP,但在中国几乎可以替代绝大多数APP。 小程序解决了H5移动网站的历史技术... -
为什么我下载的ug后处理都不能用呢
2015-12-07 13:37:22我用ug生成程序不是大了就是小了,和实际就是不一样,就不明白了,这个世界上到底有多少种尺寸 -
为什么品牌商纷纷搭建自己的商城小程序?
2019-04-25 08:54:48据闪云科技小程序了解,商城小程序近年来备受品牌商青睐。作为新型的电商形态,商城小程序有什么优势呢?...与APP相比,小程序有不需要安装及删除,用完即走的特点,不占用手机内存,不需要APP之间来回切换。... -
八个理由告诉你,为什么要用小程序做电商!
2020-07-13 12:01:38所以希望把我知道的分享给大家,希望能给后面准备进入这行的朋友一些帮助,毕竟会少走很多弯路,不知道有没有人听呢? 现如今许多朋友都会选择在工作之余开辟自己的一份副业,而作为变现方式之一的电商就是很多朋友... -
在小程序页面标记商品结构化数据(wx:scope-data)有什么用
2020-04-19 11:36:01wx:scope-data 是微信小程序搜索SEO能力提供的结构化数据格式 开发者需要在WXML组件内对属性 wx:scope-data设置一个对象来标识页面结构化数据。 使用方式: 注意事项 1、必填字段不能缺省,否则会报错。 2、各个... -
小程序真的能帮商家挣到钱吗
2019-03-14 03:04:46小程序商城为什么被炒的这么火? 开发一个小程序商城就能赚钱? 小程序商城真的值得做吗? 面对这红透半边天的小程序,大多数商家都会产生这些困惑,迟疑自己到底该不该开发一个小程序商城,不开发吧,看着竞争对手... -
为什么代码缩进时必须要用 Tab 而不能用空格
2018-06-02 22:32:26但是不使用 Tab 的话,就得多一道程序处理你的代码,以保证文件大小合理。你不得不依赖压缩工具。拿注释举例来说,注释很有用,即使无法压缩代码也要有注释。Tab 可以达到和空格同样的效果,所以不用 Tab 的话,... -
为什么说微信小程序是顺应时代而生的!
2018-05-15 10:05:12张小龙曾在微信公开课上说过:“微信将重点做好小程序,我们会很有耐心,用更长的周期,耐心足够,不想让它快速催肥。”所以微信小程序蛰伏了一年多才爆发。为了让小程序和公众号、APP不一样,微信团队将小程序变得... -
为什么品牌商纷纷搭建商城小程序?
2018-12-08 15:35:29为什么品牌商纷纷搭建商城小程序? 商城小程序近年来备受品牌商青睐。...与APP相比,小程序有不需要安装及删除,用完即走的特点,不占用手机内存,不需要APP之间来回切换。最近微信小程序有了星标功能... -
自己的电脑上怎么用python-如何做一个任何电脑都能用的python程序?
2020-11-01 12:20:10有时候你做好了一个小游戏或者小程序想要打包发送给别人玩或者用的时候,直接发过去,如果别人没有python环境的话,那肯定是用不了的,这时候你需要将程序打包成exe程序。将python打包成exe的方法有两种,一种是... -
小白一个,模仿别人的代码写了2个C#串口通讯程序,有一个串口不能接收数据!!! 求助?
2016-12-17 06:19:16为什么我能确定已经接收数据了,因为我在接收数据的代码那里设置了断点,再debug,(用虚拟串口和CCCOM32串口一起debug)程序能正常跑下去. 现在找不出为什么数据没有在接收窗口显示出来(我用textBox1接收数据)... -
微信小程序如何推广,有什么好处?
2020-10-15 11:02:30随走随用的轻应用,是基于微信平台开发的,随着微信小程序的功能不断完善,扫一扫,搜一搜,公众号等直接成了小程序的入口,能为企业带来更多的流量。 微信小程序的好处 1、 通过小程序可以展示公司介绍、环境、产品... -
每个公司需要有小程序的必要性
2020-10-16 09:21:04为什么小程序会这么火? 小程序作为腾讯和微信的战略级产品,得到了腾讯和微信强大的技术和市场资源的注入。 小程序的初衷不是替代所有APP,但在中国几乎可以替代绝大多数APP。 小程序解决了H5移动网站的历史技术... -
vba中,按照书上用(if then...else)编了一个小程序,为什么返回不了正确值?
2019-01-18 11:58:26* Sub 判别构成三角形() '该程序有错误,无法返回正确值 * Dim a As Double, b As Double, c As Double * Dim area As Double, s As Double * Dim flagu As Boolean, flagl As Boolean * a = CDbl(InputBox("请... -
人不能贪婪,但程序可以!用通俗的方法读懂贪心算法核心思想
2020-07-31 17:52:01文章目录前言一、通过经典题目理解1、完全背包问题分析输入数据解决问题步骤分解并非最优解2、找零问题分析输入数据解决问题步骤分解并非所有情况都能得到最优解二、为什么贪心算法得不到最优解?三、总结一下 一、... -
7个黑科技十足的微信小程序,每一个都能让你念念不舍!
2018-12-21 11:19:51基本上与现有的软件也就相差毫几,有些人为了免下软件几乎都用上了,那为什么有那么多人都钟爱于小程序呢?其关键原因就是方便,只要用微信一个软件,就可以随意使用任何小程序了! 那么今天小编在这里就为大家分享... -
如何用小程序开发app
2019-04-12 14:52:37那么我们为什么不能用小程序来开发app呢?这样不仅可以小程序和app只要开发一次,小程序和app都有了。还可以实现app动态更新不需要提交应用市场审核,我们只要做个小程序载体的app壳(类微信端小程序 sdk),而且... -
如何做一个任何电脑都能用的python程序?
2019-10-06 21:14:37有时候你做好了一个小游戏或者小程序想要打包发送给别人玩或者用的时候,直接发过去,如果别人没有python环境的话,那肯定是用不了的,这时候你需要将程序打包成exe程序。 将python打包成exe的方法有两种,一种是... -
KSVD程序中要求信号Y的列数要大于字典D的列数,不知道为什么有这个要求。
2019-03-08 20:22:33用KSVD.m训练字典,程序中有一段要求信号Y的列数要大于字典D的列数,否则就会报错,但是理论上并不需要这个要求,帮忙解释下为什么会有这个要求?(程序第91行)如果Y是n*1的向量,就不能训练出字典了吗? ``` ... -
PAT1009题:为什么不能用getline函数。。。
2019-09-06 14:47:41字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。 输出格式: 每个测试用例的输出占一行,输出倒序后的句子。 ...
-
2021-02-25
-
Docker从入门到精通
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
SecureCRT 连接 GNS3/Linux 的安全精密工具
-
在 Linux 上构建企业级 DNS 域名解析服务
-
衍射误差对相位校正效果的影响
-
HTML5动态效果制作方法整理
-
SILEX-I超短脉冲激光装置放大前级输出能量稳定性提升
-
微信公众号Python开发(Wechatpy+新浪云SAE应用)
-
微信小程序登录授权
-
OTL用于多目标优化的比较研究
-
激光会聚原子沉积技术的原子沟道化研究
-
SpringBoot的jar可以直接运行原理
-
i7 9700和i7 9700k 哪个好?差距多大?玩游戏有什么区别?
-
华工信号与系统真题与详解.zip
-
热点技术:React性能优化总结
-
第二十一章 数据库角色
-
SNOW-V-VHDL
-
响应式编程入门与实战(Reactor、WebFlux、R2DBC)
-
【硬核】一线Python程序员实战经验分享(1)