求个能 beats 90% 以上的 Move Zeroes 算法

2016-07-21 19:15:01 +08:00
 soli

题目: https://leetcode.com/problems/move-zeroes/

开始自己实现了一个,但需要 20ms ,只能 beats 27.02%。

然后去论坛中看了好几个实现,有些号称能 beats 95% , 但我照着实现、提交后仍然只能 20ms , beats 27.02%。

论坛中的实现、我的实现都和编辑推荐的算法一样。

语言选的是 C++ 。

附我的实现:

class Solution
{
public:
	void moveZeroes(vector<int>& nums)
	{
		int i = 0;
		int l = nums.size();

		while (nums[i] != 0 && i < l) ++i;

		for (int j = i + 1; j < l; ++j)
		{
			if (nums[j] != 0)
			{
				nums[i++] = nums[j];
			}
		}
		
		while(i < l) nums[i++] = 0;
	}
};
3746 次点击
所在节点    程序员
29 条回复
SuperFashi
2016-07-22 18:52:34 +08:00
这误差就是评测机的玄学,像我们这种打 oi 的就得祈祷评测机不出差错,上次写了个博弈论的记忆化搜索,基本上都在 960-990ms 之间,我运气差,交了好几遍都是 1.006s ,一怒之下刷了 5 次,终于不 tle 了。

而且 leetcode 上 java 比 c++快,不高兴。

但是我想吐槽一下两位:
@yaoyuan7571 为啥不用迭代器呢……
@pathletboy ……为啥要用 c 的 qsort 和排序函数写法, c++本来就是为了避免各种指针的使用的啊……
DaCong
2016-07-22 20:22:37 +08:00
@flyingghost 评论不支持 markdown ,只有帖子正文支持
yhylord
2016-07-22 20:43:58 +08:00
@SuperFashi 确实 C++11 的话写迭代器用 auto 就行了巨爽,但是更早的要手动写长长的 vector<int>::iterator 还是挺烦的
skydiver
2016-07-22 22:55:11 +08:00
class Solution {
public:
void moveZeroes(std::vector<int> &nums) {
std::stable_partition(nums.begin(), nums.end(),
[](int a) { return a != 0;});
}
};

最简单的写法……可惜还是 20ms
jeffersonpig
2016-07-23 18:10:43 +08:00
leetcode 的性能数据没个准头的
breeswish
2016-07-24 15:41:10 +08:00
@soli 这个其实没法儿准确测量,撞上时间片调度一下就 10ms 加上去了…

以及各种 OJ 目标并不是准确测量耗时,而是衡量你编写算法的对错,因而只测「答案是否正确」、「是否在指定时间内结束(即算法时间复杂度是否满足需求)」、「资源占用是否在指定空间内(空间复杂度是否满足需求)」,是不会多次运行测量准确时间的,这没意义。
soli
2016-07-25 11:23:51 +08:00
@breeswish 前几题都改好几次,直到改到 beats 90%+ 才算完。还蛮有成就感的。

自从知道这个时间是骗人的,就没动力继续刷了。。。
laobubu
2016-09-21 21:20:27 +08:00
https://ooo.0o0.ooo/2016/09/21/57e288f2d12d3.png

虽然是 C++,但是还是用 C 的方式写了一个,突然感觉碉堡了……
soli
2016-09-22 19:45:27 +08:00
@laobubu 66666666666

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/294031

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX