2Sum,3Sum,4Sum,kSum,3Sum Closest系列
1).2sum
1.题意:找出数组中和为target的所有数对
2.思路:排序数组,然后用两个指针i、j,一前一后,计算两个指针所指内容的和与target的关系,如果小于target,i右移,如果大于,j左移,否则为其中一个解
3.时间复杂度:O(nlgn)+O(n)
4.空间:O(1)
5.代码:
void twoSum(vector<int>& nums,int numsSize,int target,vector<vector<int>>& twoSumRes) {
int i=0,j=numsSize-;
while(i<j){
if(nums[i]+nums[j] < target ){
i++;
}else if(nums[i]+nums[j] > target ){
j--;
}else{
vector<int> oneOfRes;
oneOfRes.push_back(nums[i]);
oneOfRes.push_back(nums[j]);
twoSumRes.push_back(oneOfRes);
i++;
/* 找不重复的数对 */
while(nums[i]==nums[i-])i++;
j--;
/* 找不重复的数对 */
while(nums[j]==nums[j+])j--;
}
}
}
2).3sum
1.题意:找出数组中和为target的所有三个数的组合,任意两个组合中的元素不能全相同,例如,target=5,2,2,1和1,2,2就是重复的组合,因为两个组合中的元素完全相同,只能取其中的一个。
2.思路:这个题可以转换题意,取数组中的一个元素a,求剩余元素中和为target-a的所有不重复数对,转换为2Sum问题。
3.时间复杂度:O(nlgn)+O(n*n)
4.空间:O(1)
5.代码:
class Solution {
public:
void twoSum(vector<int>& nums,int numsSize,int start,int target,vector<vector<int>>& twoSumRes) {
int i=start,j=numsSize-;
while(i<j){
if(nums[i]+nums[j] < target ){
i++;
}else if(nums[i]+nums[j] > target ){
j--;
}else{
vector<int> oneOfRes;
oneOfRes.push_back(nums[i]);
oneOfRes.push_back(nums[j]);
twoSumRes.push_back(oneOfRes);
i++;
while(nums[i]==nums[i-])i++;
j--;
while(nums[j]==nums[j+])j--;
}
}
}
vector<vector<int>> threeSum(vector<int>& nums) {
size_t nums_size = nums.size();
vector<vector<int>> res;
sort(nums.begin(),nums.end());
for(size_t i=;i<nums_size;i++){
if(i> && (nums[i]==nums[i-])){
continue;
}
vector<vector<int>> twoSumRes ;
twoSum(nums,nums_size,i+,-nums[i],twoSumRes);
if(!twoSumRes.empty()){
size_t j_times = twoSumRes.size();
for(size_t j=;j<j_times;j++){
twoSumRes[j].insert(twoSumRes[j].begin(),nums[i]);
res.push_back(twoSumRes[j]);
}
}
}
return res;
}
};
3).4Sum,kSum
1.题目:求所有和为target的4个元素的不重复组合,任意两个组合中的元素不能全相同。
2.思路:递归,4Sum->3Sum->2Sum
3.时间复杂度:O(nlgn)+O(n*n*...*n),k-1个n
代码:
class Solution {
public:
vector<vector<int>> towSum(vector<int>& nums,int numsSize,int start,int target)
{
vector<vector<int>> res;
int i = start,j=numsSize-;
while(i<j){
if(nums[i] + nums[j] < target){
i++;
}else if(nums[i] + nums[j] > target){
j--;
}else{
vector<int> item;
item.push_back(nums[i]);
item.push_back(nums[j]);
res.push_back(item);
i++;
while(nums[i]==nums[i-])i++;
j--;
while(nums[j]==nums[j+])j--;
}
}
return res;
} vector<vector<int>> kSum(vector<int>& nums,int numsSize,int start,int k,int target)
{
if(k==){
return towSum(nums, numsSize, start, target);
}else{
vector<vector<int>> kSumRes;
for(size_t i=start;i<numsSize;i++){
if(i>start && (nums[i]==nums[i-])){
continue;
} vector<vector<int>> item = kSum(nums,numsSize,i+,k-,target-nums[i]);
size_t itemSize = item.size();
for(size_t j=;j<itemSize;j++){
item[j].insert(item[j].begin(),nums[i]);
kSumRes.push_back(item[j]);
}
}
return kSumRes;
}
}
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
size_t numsSize = nums.size();
return kSum(nums,numsSize,,,target);
}
};
4).类似的题,3Sum Closest
1.题目:
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
2.时间:O(nlgn)+O(n*m*2),m*2表示试探次数
3.代码
class Solution {
public:
bool twoSum(vector<int>& nums,int numsSize,int start,int target)
{
int i=start,j=numsSize-;
while(i<j){
if(nums[i] + nums[j] < target){
i++;
}else if(nums[i] + nums[j] > target){
j--;
}else{
return true;
}
}
return false;
}
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
size_t numsSize = nums.size();
int increasment = ;
while(true){
bool hasTwoSum = false;
for(size_t i=;i<nums.size();i++){
hasTwoSum = twoSum(nums,numsSize,i+,target+increasment-nums[i]);
if(hasTwoSum){
break;
}
hasTwoSum = twoSum(nums,numsSize,i+,target-increasment-nums[i]);
if(hasTwoSum){
increasment = -increasment;
break;
}
}
if(hasTwoSum){
break;
}
increasment++;
}
return target+increasment;
}
};
5).后序:
这类题的算法原型就是2Sum,在求不重复的数对时,有个小技巧(排好序的基础上),就是在求得arry[i]+arry[j] == target时,要去掉与arry[i]和arry[j]相等的元素。
这种使用两个指针处理数组的方法也很常见,例如,排序颜色数组,奇数偶数分类,有序数组中连续子数组和为target的所有组合等等
2Sum,3Sum,4Sum,kSum,3Sum Closest系列的更多相关文章
- 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
转自 http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...
- LeetCode Two Sum&Two Sum II - Input array is sorted&3Sum&4Sum 一锅煮题解
文章目录 Two Sum Two Sum II 3Sum 4Sum Two Sum 题意 给定一个数组,和指定一个目标和.从数组中选择两个数满足和为目标和.保证有且只有一个解.每个元素只可以用一次. ...
- 6.3Sum && 4Sum [ && K sum ] && 3Sum Closest
3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find a ...
- LeetCode解题报告--2Sum, 3Sum, 4Sum, K Sum求和问题总结
前言: 这几天在做LeetCode 里面有2sum, 3sum(closest), 4sum等问题, 这类问题是典型的递归思路解题.该这类问题的关键在于,在进行求和求解前,要先排序Arrays.sor ...
- 15. 3Sum、16. 3Sum Closest和18. 4Sum
15 3sum Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = ...
- leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST
1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...
- 秒杀 2Sum 3Sum 4Sum 算法题
2 Sum 这题是 Leetcode 的第一题,相信大部分小伙伴都听过的吧. 作为一道标着 Easy 难度的题,它真的这么简单吗? 我在之前的刷题视频里说过,大家刷题一定要吃透一类题,为什么有的人题目 ...
- 3Sum & 4Sum
3 Sum Given an array S of n integers, are there elements a, b, c in Ssuch that a + b + c = 0? Find a ...
- 3Sum,4Sum问题
//三数和为0的问题.要求去重,并且输出数字有序.public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(n ...
随机推荐
- oracle生成随机数
UPDATE busi_chance_info t SET t.exp_amount = (SELECT floor(dbms_random.value(1, 10000000)) ...
- 极客”一词,来自于美国俚语“geek”的音译,一般理解为性格古怪的人
起源 “ 极客”一词,来自于美国俚语“ geek”的音译,一般理解为性格古怪的人.数学“极客”大多是指,并不 一定是数学专业但又对数学等技术有狂热的兴趣并投入大量时间钻研的人.又 译作“ 奇客”.以前 ...
- Mysql常用命令和常用函数
函数 : FROM_UNIXTIME(unix_timestamp,format) 时间戳转字符串日期格式 格式化规则如下 %M 月名字(January……December) %W 星期名字(Sun ...
- CSS3动画之透视
若在x,y轴rotate90度,其实是线,不显示,按近大远小的透视关系可用 perspective:数值 开启透视: 默认以中间线为旋转基线,可以用transform-origin来设置旋转基线 在z ...
- JuPyter(IPython) Notebook中通过pip安装第三方Python Module
JuPyter(IPython) Notebooks中使用pip安装Python的模块 刚开始接触JuPyter Notebook的时候觉得这是个不错的写技术博客的工具,可以很直观的把代码和结果结合在 ...
- Delphi 10.1 Berlin 与 Delphi 10 Seattle 共存
以下安装环境是win7 64位 1. 安装Delphi10.1 Berlin 版本. 2.修改C:\Program Files (x86)\Embarcadero\Studio\18.0\cglm.i ...
- python 在linux下通过top,和dh命令获得cpu,内存,以及硬盘信息
主要是通过os.popen读取命令输出实现的,os.popen启动新的进程,且将外部命令的输出作为文件类型对象返回.不能获得外部命令的返回值.既然是文件对象就可以直接用for in 来读取,代码如下: ...
- Eclipse 安装使用 Maven
安装 Maven 下载 Maven http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9 ...
- Obstack是C标准库里面对内存管理的GNU扩展
Obstack是C标准库里面对内存管理的GNU扩展 Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 ...
- C语言随笔_区分=与==
写C程序时,经常发现大家=与==分不清.最常见的写法如下:int a = 3;if(a = 1){.......} 写程序的人原意是想如果a等于1的话,就执行花括号里的语句,a初始化时的值是3,也就是 ...