📣 独立日限时特惠: VIP通行证立减$68
查看: 2978| 回复: 12
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 4sum

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> result;
if (num.size() < 4) return result;
sort(num.begin(), num.end());
unordered_map<int, vector<pair<int, int> > > cache;
for (size_t a = 0; a < num.size(); ++a) {
for (size_t b = a + 1; b < num.size(); ++b) {
cache[num[a] + num[b]].push_back(pair<int, int>(a, b));
}
}
for (int c = 0; c < num.size(); ++c) {
for (size_t d = c + 1; d < num.size(); ++d) {
const int key = target - num[c] - num[d];
if (cache.find(key) == cache.end()) continue;
const auto& vec = cache[key];
for (size_t k = 0; k < vec.size(); ++k) {
if (c <= vec[k].second)
continue; // 有重叠
result.push_back( { num[vec[k].first],
num[vec[k].second], num[c], num[d] });
}
}
}
sort(result.begin(), result.end());
result.erase(unique(result.begin(), result.end()), result.end());
return result;

这是leetcode 4sum的参考答案之一,倒数第二句代码,我还是有点不太明白
result.erase(unique(result.begin(), result.end()), result.end());
unique返回的是去除duplicates的result,他是一个数组?不知道我有没有理解错
erase两个参数按道理应该第一个是开始擦除的起始位置,第二个是擦除操作的结束位置,但是unique返回的不是数组吗?这样就矛盾了!

求大神解答!!本人感激不尽!!

上一篇:检测图中是否有cycle
下一篇:Count number of 2s, 给一个数n,求0到n里一共有多少个2.
推荐
stellari 2015-12-15 00:33:45 | 只看该作者
全局:
Struggling 发表于 2015-12-14 05:29
还有一个问题
result.push_back( { num[vec[k].first], num[vec[k].second], num[c], num[d] });
参考 ...

用gcc的话,要保证你的版本支持c++11,并且编译的时候使用 -std=c++11 开关。另外,建议找本C++11的新语法的书或者网上教程来看看,很多你问的问题看完书以后都能迎刃而解了。

评分

参与人数 1大米 +5 收起 理由
beer + 5 回答的很好!

查看全部评分

回复

使用道具 举报

推荐
 楼主| Struggling 2015-12-14 05:29:37 | 只看该作者
全局:
stellari 发表于 2015-12-13 22:40
unique返回的不是数组,而是一个迭代器。具体来说,是从容器中删除掉一些元素后,“指向最后一个未被删除的 ...

还有一个问题
result.push_back( { num[vec[k].first], num[vec[k].second], num[c], num[d] });
参考答案是这么写的,但是在linux环境下运行会报错,不知道怎么回事,
我改成了以下形式才运行成功 vector<int> temp;
          temp.push_back(num[vec[k].first]);
          temp.push_back(num[vec[k].second]);
          temp.push_back(num[c]);
          temp.push_back(num[d]);
          result.push_back(temp);
我想问问,参考答案上面的push_back方式没有办法实现是我代码问题吗?还是编译器问题?如果可以用参考答案用的方法,该做如何改动?
回复

使用道具 举报

🔗
 楼主| Struggling 2015-12-13 12:11:41 | 只看该作者
本楼:
全局:
up up up up
回复

使用道具 举报

🔗
 楼主| Struggling 2015-12-13 21:15:35 | 只看该作者
全局:
没有人看到吗?
回复

使用道具 举报

🔗
stellari 2015-12-13 22:40:05 | 只看该作者
全局:
unique返回的不是数组,而是一个迭代器。具体来说,是从容器中删除掉一些元素后,“指向最后一个未被删除的元素的后一位置”的迭代器。比如[2, 3, 3, 5, 5],删除完以后数组变为[2, 3, 5, ?, ?]。unique返回的迭代器就是指向第一个?的位置。

评分

参与人数 1大米 +15 收起 理由
aznfy + 15

查看全部评分

回复

使用道具 举报

🔗
 楼主| Struggling 2015-12-14 04:33:45 | 只看该作者
全局:
stellari 发表于 2015-12-13 22:40
unique返回的不是数组,而是一个迭代器。具体来说,是从容器中删除掉一些元素后,“指向最后一个未被删除的 ...

谢谢!能进一步给我解释下auto的用法吗?比如说这一句
const auto& vec = cache[key];
回复

使用道具 举报

🔗
 楼主| Struggling 2015-12-14 22:40:22 | 只看该作者
全局:
呜呜呜呜,都没有人回答我的问题!!
回复

使用道具 举报

🔗
 楼主| Struggling 2015-12-15 02:43:14 | 只看该作者
全局:
stellari 发表于 2015-12-15 00:33
用gcc的话,要保证你的版本支持c++11,并且编译的时候使用 -std=c++11 开关。另外,建议找本C++11的新语 ...

请问Gcc是什么?
回复

使用道具 举报

🔗
stellari 2015-12-15 08:31:48 | 只看该作者
全局:

。。。那你在Linux下是用什么编译的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表