之前的OJ战场在 HackerRank ,今天终于禁不住铺天盖地的诱惑,加入 LeetCode 大军
按照学编程就从“Hello world!”开始的尿性,刷OJ当然也从 1 号题出发
Aha~~~!看起来是非常简单的问题呢!
先来个暴力for for法!
什么?!不行?!
这我当然知道!玩玩儿你!
如果不对数组进行排序,那么对于一般的方法,必然是需要进行两两相加比较的(由不加证明的脑内剧场给出……)
好,排序。
<span style="font-family:Microsoft YaHei;">std::sort(numbers.begin(), numbers.end());</span>
<span style="font-family:Microsoft YaHei;">std::map<int, int> index_num_map;</span>
可是这些思路形成后,想到了一些比较奇怪的问题。
如果输入是 [1,-2,7,-1,6], 5 怎么破?该输出 -2,7 的下标还是 -1,6 的下标?
大概是输出优先成对的吧
可是排序之后必然使得优先顺序打乱……
如果没有配对值,题目接口又必须返回一个vector,这个vector应该包含什么?
空的吧
又或者[0,0]吧
于是又否定了排序的思路,开始想着在原方法上简化
例如使用各种 if 手段跳过某些循环项
这么尝试了各种办法,N次(后面会看到,真的是很多次),还是不行
不过在这些试验中,通过错误数据渐渐发现是我想多了 ORZ……
日啊,审题审题!!!这个初中高中就被各科老师强调无数次的东西,还是中计了!!!
“YOU MAY ASSUME THAT EACH INPUT WOULD HAVE EXACTLY ONE SOLUTION”
说多了都是泪,直接造成最后我的提交就是这样的↓↓↓
总结一下:
1、LeetCode的题目确实别于其他的OJ,更加侧重于解决某个特殊的实际问题
2、函数接口给定,不需要自己写IO什么的,这点和第一条一致
3、代码无法直接复制进IDE调试,要么肉眼Debug(甚至连std::cout都不会输出!),要么自己动手写Client
4、正因为各种限定较多,更需要仔细阅读题目,理解题目
5、O(N^2)就是 O(N^2),不能指望通过 if 来降低复杂度。