先看一下别人的博客:http://blog.csdn.net/booirror/article/details/43950477
这个问题在:https://oj.leetcode.com/problems/rotate-array/,属于比较简单那种
上面作者的思路跟我一样,正常人思维就应该这样,不过我提交之后,系统提示:time limit extended。尼玛居然告诉我时间超过了界限,于是触发了我的“优化”的想法。
简单的想法就是算法优化,用更加精巧的方法来实现,不过,程序员往往把“看起来很巧”跟“运行起来很快”弄混,搞一些奇技淫巧的东西,结果反而变慢了。因为,你写的再牛B的代码,也是靠编译器编译连接生成exe对吧,这一步你控制不了的,你写a=x++,感觉上似乎是简洁了,而实际上,编译器会生成一个临时变量保存x的值,再把x+1,再把这个临时变量赋值给a,其实跟你明明白白老老实实写代码是一样的。
你想马儿跑的好,又想马儿不吃草,那你是在做梦!优化里面也有一种叫“用时间换空间”,对应的就有“用空间换时间”。比如:我问你7x8=?,你会计算8+8+8……加上7次吗?你会直接回答我56!但是,谁告诉你的,你咋这么“聪明”呢?其实,你背下来“九九乘法表”,本身就是算法优化的过程。其他学霸也是一样,做过的题目形成一种“半成品”,考试时候会用你无法相信的速度完成,不是他比你大脑CPU快,而是cache比你大,比你快。
我的想法就是把一个循环的copy,变成一块内存的copy,但是需要一块临时内存,用空间换取了时间。
void rotate(int nums[], int n, int k) {
if (k <=0 || n <=0)
{
return;
}
if (k>=n)
{
k = k%n;
}
int * pN = new int[k];
memcpy(pN, nums+n-k, k*sizeof(int));
memmove( nums + k,nums, (n - k)*sizeof(int));
memcpy(nums , pN, k*sizeof(int));
delete pN;
//for (int i = 0; i < k; i++)
//{
// int a = nums[n - 1];
// for (int j = n-1; j > 0;j--)
// {
// nums[j] = nums[j - 1];
// }
// nums[0] = a;
//}
}
注释部分就是跟上面博客写法一样,不过性能不行被pass了。就是把循环赋值变成内存copy,结果非常惊人:
接近了C++组的最大性能了,当然这种“浪费空间”不算在考虑因素内,单纯考虑时间,已经接近极限了。
很多时候凭借感觉去优化是一群“自命不凡”的程序员最爱,尤其是赶上了“力排众议”的“乔布斯似的天才”,那么他的任何错误都不会被改正,程序就这样将错就错的运行下去,出问题都是别人的,有功劳都是自己的,这样代码就沿着“熵”越来越大的路线越走越远,最后只能推倒重来了。这个是生产关系束缚了生产力,跟我们考虑的提高生产力水平的问题不是一个问题,但是你汽车跑得快,比不上马路堵车对速度的影响力要大,这样生成关系就成了制约你程序的主要矛盾了,如果不从生产关系入手,那么你买再好的车,也只能在马路上堵着,那时候千万别骂街:“神马破车,还奔驰宝马呢,跟QQ微面一样快!”,我除了说你是SB以外,别的已经没啥可说的了。