【LeetCode & 剑指offer刷题】数组题3:3Sum(系列) + 4sum

发布时间:2021-12-02 14:50:16

【LeetCode & 剑指offer刷题】数组题3:3Sum(系列) + 4sum



【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)


3Sum







Given an array
?
nums
?
of
?
n
?
integers, are there elements
?
a
,
?
b
,
?
c
?
in
?
nums
?
such that
?
a
?
+
?
b
?
+
?
c
?
= 0? Find all unique triplets in the array which gives the sum of zero.


Note:


The solution set must not contain duplicate triplets.


Example:



Given array nums = [-1, 0, 1, 2, -1, -4],


?


A solution set is:


[


[-1, 0, 1],


[-1, -1, 2]


]












C++







?



//问题:找数组中和为0的三元组


//方法:排序后,扫描数组,转化为2sum问题


//2sum对应一个循环,3sum对应两重循环,4sum对应三重循环


//O(n^2)


#include


class
Solution


{


public
:


??? vector
<
vector
<
int
>>
threeSum
(
vector
<
int
>&
a
)


???
{


??????? vector
<
vector
<
int
>>
res
;


???????
int
n
=
a
.
size
();


???????
if
(
n
<
3
)
return
res
;


???????


??????? sort
(a.begin(), a.end()); //排序



?




?? ??? ?//扫描a[i],后面在用left和right首尾两指针扫描



???????
for
(
int
i
=
0
;
i
<
n
&&
a
[
i
]<=
0
;
i
++)
//第一个数只能是负数或0,加此判断以节省时间,如果不加次判断,则i

???????
{


???????????
int
target
=
-
a
[
i
];
//将第一个数的相反数定为2sum的target?


??????????? int left = i+1;?//i=0~n-3


??????????? int right = n-1;



?



???????????
while
(
left
<
right
)
//用两个指针分别从a[i+1]和整个数组末尾开始向中间扫描 ,找到所有可以满足和为-a[i]的数对


???????????
{


???????????????
int
sum
=
a
[
left
]
+
a
[
right
];


???????????????
if
(
sum
<
target
)
left
++;
//仅移动前面指针


???????????????
else
if
(
sum
>
target
)
right
--;
//仅移动后面指针


???????????????
else
//满足3sum要求


???????????????
{


??????????????????? res
.
push_back
(
{
a
[
i
],
a
[
left
],
a
[
right
]});
?
//将满足的三元组push到结果向量中(也可以用vector{a[i], a[left], a[right]})



?



???????????????????
while
(
left
<
right
&&
a
[
left
+
1
]
==
a
[
left
])
left
++;
//以免第二个数重复


???????????????????
while
(
left
<
right
&&
a
[
right
-
1
]
==
a
[
right
])
right
--;
//以免第三个数重复


??????????????????? left
++;
//
前后指针都移动,下一次判断


??????????????????? right
--;


???????????????
}


???????????
}


???????????
while
(
i
+
1
<
n
&&
a
[
i
+
1
]
==
a
[
i
])
i
++;
//以免第一个数重复


???????
}


???????


???????
return
res
;


???
}


};


/*注:


也可用set避免重复


set> res;


...


vector int
>>
(res.begin(), res.end());//用迭代器将set转为vector


*/



?


16
.
?
3Sum Closest





Given an array
?
nums
?
of
?
n
?
integers and an integer
?
target
, find three integers in
?
nums
?such that the sum is closest to?
target
. Return the sum of the three integers. You may assume that each input would have exactly one solution.


Example:



Given array nums = [-1, 2, 1, -4], and target = 1.


?


The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).








?




/*


问题:离目标值最*的三数之和


方法:排序后,扫描
a[i],
后面在用
left

right
首尾两指针扫描


*/


class
Solution


{


public
:


???
int
threeSumClosest
(
vector
<
int
>&
nums
,
int
target
)


???
{


???????
if
(
nums
.
size
()<
3
)
return
0
;


???????


???????
int
closest
=
nums
[
0
]
+
nums
[
1
]
+
nums
[
2
];


???????
int
diff
=
abs
(
closest
-
target
);


??????? sort
(nums.begin(), nums.end()); //排序


???????


???????
//扫描a[i],后面在用left和right首尾两指针扫描


???????
for
(
int
i
=
0
;
i
<
nums
.
size
()
-
2
;
i
++)
?
//i=0~n-3(n-2,n-1
分别为
left

right
占着
)


???????
{


???????????
int
left
=
i
+
1
,
right
=
nums
.
size
()
-
1
;
// left = i+1, right=n-1


???????????


???????????
while
(
left
<
right
)


???????????
{


???????????????
int
sum
=
nums
[
i
]
+
nums
[
left
]
+
nums
[
right
];


???????????????
int
newDiff
=
abs
(
sum
-
target
);


???????????????
if
(
newDiff diff )
//
更新
diff

sum


???????????????
{


??????????????????? diff
=
newDiff
;


??????????????????? closest
=
sum
;


???????????????
}


???????????????


???????????????
if
(
sum
<
target
)
left
++;
//
调节指针


???????????????
else
right
--;


???????????
}


???????
}


???????
return
closest
;


???
}


};





?




18.?4Sum







Given an array?nums?of?n?integers and an integer?target, are there elements?a,?b,?c, and?d?in?nums?such that?a?+?b?+?c?+?d?=?target? Find all unique quadruplets in the array which gives the sum of?target.


Note:


The solution set must not contain duplicate quadruplets.


Example:



Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.


?


A solution set is:


[


[-1, 0, 0, 1],


[-2, -1, 1, 2],


[-2, 0, 0, 2]


]








Seen this question in a real interview before???
Yes
No





?




?







/*


问题:找与目标值相等的
4
个数


三重循环即可



set
可避免重复结果


*/


class
Solution


{


public
:


??? vector
<
vector
<
int
>>
fourSum
(
vector
<
int
>
&
nums
,
int
target
)


???
{


???????
if
(
nums
.
size
()
<
4
)
return
vector
<
vector
<
int
>>();
//
或者用
{{}}


???????


??????? set
> res;


??????? sort
(
nums
.
begin
(),
nums
.
end
());


???????


???????
//
扫描
a[i],a[j]
后面接
left,right
两个指针


???????
for
(
int
i
=
0
;
i
<
int
(
nums
.
size
()
-
3
);
i
++)


???????
{


???????????
for
(
int
j
=
i
+
1
;
j
<
int
(
nums
.
size
()
-
2
);
j
++)


???????????
{


???
//??????????? if (j > i + 1 && nums[j] == nums[j - 1]) continue; //
遇到重复数时不执行下面语句,如果用
set
可以不进行此判断


???????????????


???????????????
int left = j + 1, right = nums.size() - 1;?//i=0~n-4,j=i+1~n-3


???????????????
while
(
left
<
right
)


???????????????
{


???????????????????
int
sum
=
nums
[
i
]
+
nums
[
j
]
+
nums
[
left
]
+
nums
[
right
];


???????????????????
if
(
sum
==
target
)


???????????????????
{


??????????????????????? vector
<
int
>
out
{
nums
[
i
],
nums
[
j
],
nums
[
left
],
nums
[
right
]};


??????????????????????? res
.
insert
(
out
);
//

set,
当有重复结果时,插入会失败


??????????????????????? left
++;
right
--;


???????????????????
}


???????????????????
else
if
(
sum
<
target
)
left
++;


???????????????????
else
right
--;


???????????????
}


???????????
}


???????
}


???????
return
vector
<
vector
<
int
>>(
res
.
begin
(),
res
.
end
());
//由set转化为vector输出


???
}


};



?


?















posted @
2019-01-05 13:46
wikiwen 阅读(
...) 评论(
...)
编辑
收藏

相关文档

  • 好看的完本小说
  • 刷了两遍LeetCode之后,我拿了9个offer
  • 中考感谢信范文
  • 吃什么让脸色红润
  • 上海到厦门自驾游攻略
  • 山药豆的营养与功效
  • 微信公众号核心代码实现
  • 猪八戒鼻子怎么做
  • 计算机教育基础研究论文
  • 最新经典的新婚祝福语汇总
  • 与植物为友的优美散文
  • 白芨粉的功效与作用以及用法介绍
  • 毛巾用久了变得又黄又硬怎么破 毛巾的不良使用方法
  • 初三家长综合评定评语
  • 快速弄懂iPhone X 设计尺寸和适配
  • 常用急救护理知识小结
  • centos安装mysql初始化没有密码_centos7 安装MySQL7 并更改初始化密码
  • 拆解国企数字化转型的锦囊
  • 编译安装软件
  • 便利店转让协议模板
  • 水果也能使你的皮肤更美白
  • 2017公务员行测资料分析试题附答案解析
  • docker操作
  • 工作一年有余,以后的路该怎么走
  • 我爱硕果累累的秋天
  • 眼角长斑怎么回事
  • 宝宝内裤多久换一次内裤多久换新一次
  • 成语对联精卫填海
  • 肥东县有哪些寄宿式小学--急
  • 男人 教你如何正确应对更年期
  • 猜你喜欢

  • 鬼吹灯系列哪部最好看、精彩
  • 金钱共同面对的话题作文
  • 2010年澳门特别行政区针灸护理考试题库
  • 2016-2017学年江苏省盐城市阜宁县高二上学期期中数学试卷与解析
  • 建筑工程项目管理(二级)测试题V
  • 2018-2019年南京市浦口区柳袱小学三年级上册科学模拟复习题无答案
  • 小学议论文作文:太湖变了8
  • 土木工程的施工项目管理措施探析
  • 范文-读《简爱》有感 精品
  • 毕业写给老师离别赠言的作文
  • 【优质文档】2018年度基层干部个人思想工作总结-优秀word范文 (2页)
  • 对培养和发展学生智力的一些看法
  • 辽宁省鞍山市台安县2019届九年级上学期第一次月考语文试题(图片版)
  • 八年级生物上册 第四单元 第一章 绿色开花植物的一生
  • 专业喷砂玻璃加工
  • 江西省金溪县第一中学2018_2019学年高二英语12月月考试题(含解析)
  • 简单的逻辑学-读书笔记
  • 吉林省兴田担保有限公司(企业信用报告)- 天眼查
  • 三万活动驻村工作心得体会范文
  • 深圳市华达机电有限公司企业信息报告-天眼查
  • 2012年初级会计职称考试《初级会计实务》第七章模拟测试题及答案
  • 可爱卡通PPT模板206课件_1749271887.ppt
  • 《邱祖秘传小周天歌诀》注解
  • 【推荐】2019秋九年级物理全册第十五章电流和电路第2节电流和电路课件新版新人教版.ppt
  • 珠三角出口制造业产业价值链分析
  • 新乡市重点科技攻关计划项目验收报告编写提纲
  • 苏州志义贸易有限公司企业信用报告-天眼查
  • 大雪时节养生食谱
  • 山东科技大学泰山科技学院GPS原理及应用期末试题B
  • 虚子雨:常见四问教你如何做好SEO
  • 【感谢信】给朋友的感谢信3篇
  • 2014北师大版八年级上册生物期中测试卷
  • 猫咪喂什么东西容易胖猫吃什么最有营养最会长胖
  • 初三--走进实验室--实验室仪器介绍
  • 2019年三年级上学期语文期末试卷
  • 美国的名人名言
  • 佛山市南海区丹灶艾豪五金厂(企业信用报告)- 天眼查
  • 世界上重量最大的人
  • 医院工作会议主持词
  • 部编版历史七年级上册优质教案全册
  • 苹果耳机按住话筒才有声音
  • 山西省晋中市榆社县2017-2018学年高一历史上学期期中
  • 电脑版