LeetCode OJ:Group Anagrams
2015-11-03 19:38
225 查看
题目:
我的代码:
结果:
我的思路:
因为之前做过一道名为single Number II的题,感觉有点类似,所以我也采用了相同的比较思路,但结果却超时了。后来发现前者比较时,只需进行3次比较就可退出一次循环了。而这题的思路是必须将一次循环遍历完,其结果当然是循环时间大大增加。
由于本人太渣想不到更好的思路,所以参考了别人优秀的代码:/article/3634512.html
参考代码如下:
我的理解与学习:
在leetcode上提交该博主的代码,发现运行时间非常短,才60ms。这说明该代码执行效率高,算法思路值得学习和借鉴。
在我第一版的代码中,我与作者有相同的想法,即先将strs中的字符串排序,方便后续查找。但是没有想过将这重排后的字符串作为键值查找。
/article/4658123.html
确实孤陋寡闻了,不过正好学习了,的确比长长的iterator抒写来的方便。
代码中运用了unordered_map、以前只用过map,汗!,于是百度了下 unordered_map 与map之前的区别,先简要总结如下:
a):库不同。STL::map、Boost::unordered_map
b):map内部的元素是有序排列的,二unordered_map是无序的。
c):stl::map 的key需要定义operator< 。 而boost::unordered_map需要定义hash_value函数并且重载operator==。
d):map的用法:
unordered_map 的用法:
这其中的知识点又涉及到hash表和红黑树需要学习,继续fighting~~
我的代码:
class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { vector<string> list; vector<vector<string>> group_list; vector<string>::size_type i, j, len; string::size_type size, count, k, sum_count; len = strs.size(); sort(strs.begin(), strs.end()); for (i = 0; i < len; i++) { list.clear(); list.push_back(strs[i]); //将原先字符串压入 if (strs[i].empty()){ size = len; } else { size = strs[i].size(); //计算该字符串的长度 } count = 1; //同元素的字符串个数,为1表示将当前字符串计算在内 for (j = i + 1; j < len; j++) { if (strs[j].find_first_not_of(strs[i]) == string::npos || strs[j] == strs[i]) //表明两字符串同元素 { list.push_back(strs[j]); strs[j].swap(strs[i + 1]); //将坐标为j的元素与坐标为i+1的元素互换,可以加快循环进度 i++; //上一步内容互换位置后,则下一个元素无需再次比较了 count++; //含相同元素的字符串个数加1 } }//for_j //sort(list.begin(), list.end()); //将list中的字符从小到大排序 group_list.push_back(list); //将有相同元素构成的一组字符串压入到group_list中 }//for_i //sort(group_list.begin(), group_list.end()); return group_list; } };
结果:
我的思路:
因为之前做过一道名为single Number II的题,感觉有点类似,所以我也采用了相同的比较思路,但结果却超时了。后来发现前者比较时,只需进行3次比较就可退出一次循环了。而这题的思路是必须将一次循环遍历完,其结果当然是循环时间大大增加。
由于本人太渣想不到更好的思路,所以参考了别人优秀的代码:/article/3634512.html
参考代码如下:
vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string, vector<string>> hashMap; for(auto &v : strs) { string tmp(v); sort(tmp.begin(), tmp.end()); hashMap[tmp].push_back(v); } vector<vector<string>> result(hashMap.size()); int k = 0; for(auto it = hashMap.begin(); it != hashMap.end(); ++it, ++k) { result[k].swap(it->second); sort(result[k].begin(), result[k].end()); } return result; }
我的理解与学习:
在leetcode上提交该博主的代码,发现运行时间非常短,才60ms。这说明该代码执行效率高,算法思路值得学习和借鉴。
string tmp(v); sort(tmp.begin(), tmp.end());
在我第一版的代码中,我与作者有相同的想法,即先将strs中的字符串排序,方便后续查找。但是没有想过将这重排后的字符串作为键值查找。
for(auto &v : strs)第一次见到这种写法,百度发现这是c++11中新加入的语法,可参考:
/article/4658123.html
确实孤陋寡闻了,不过正好学习了,的确比长长的iterator抒写来的方便。
代码中运用了unordered_map、以前只用过map,汗!,于是百度了下 unordered_map 与map之前的区别,先简要总结如下:
a):库不同。STL::map、Boost::unordered_map
b):map内部的元素是有序排列的,二unordered_map是无序的。
c):stl::map 的key需要定义operator< 。 而boost::unordered_map需要定义hash_value函数并且重载operator==。
d):map的用法:
#include<map> using namespace std;
unordered_map 的用法:
#include <unordered_map> using std::unordered_map;
这其中的知识点又涉及到hash表和红黑树需要学习,继续fighting~~
相关文章推荐
- 补充上一篇博客
- js页面跳转整理
- griedview setOnItemLongClickListener 无效
- 常用WEB服务器的特点介绍
- HMI开发与控件
- Linux3.4内核的基本配置和编译
- poj 1661 Help Jimmy
- Shell_循环语句(for、while、case)深入讲解
- 最小编辑距离(字符串相似度)
- 作为一个技术人员的折腾精神
- C++ Primer Chap3
- Oracle &符号如何插入(转义)
- hdu1312 Red and Black
- iOS 得到当前时间之前和之后N天的日期
- C语言——基本概念
- css--【DRP】
- hdu 1015 Safecracker 暴力
- RecyclerView
- RHEL7修改root用户密码
- android 每周学习笔记及总结(每周更新)