博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leecode 解题总结:18 4Sum
阅读量:3656 次
发布时间:2019-05-21

本文共 3419 字,大约阅读时间需要 11 分钟。

#include 
#include
#include
#include
#include
using namespace std;/*问题:Given an array S of n integers, are there elements a, b, c, and d in S 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.For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.分析:用3Sum来做。罗列第一个数和第二个数,时间复杂度为O(n^3)A solution set is:[ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2]输入:6(数组元素个数) 0(目标和)1 0 -1 0 -2 29 120 4 -5 2 -2 4 2 -1 4输出:-1 0 0 1, -2 -1 1 2, -2 0 0 20 4 4 4, 2 2 4 4关键:1 4Sum用3Sum来做。罗列第一个数和第二个数,时间复杂度为O(n^3)for(int i = 0 ; i < size - 2 ; i++){ int target_3 = target - nums.at(i); for(int j = i + 1 ; j < size - 1; j++) { int target_2 = target_3 - nums.at(j); int low = j + 1; int high = size - 1; while(low < high) { sum = nums.at(low) + nums.at(high); if(sum < target_2) { low++; } else if(sum > target_2) { high--; } else { Result result(nums.at(i) , nums.at(j) , nums.at(low) , nums.at(high)); setResult.insert(result); low++; high--; } } }}*/typedef struct Result{ Result(){} Result(int min ,int mid1 , int mid2 , int max):_min(min),_mid1(mid1),_mid2(mid2),_max(max){} bool operator < (const Result& result) const { if(_min != result._min) { return _min < result._min; } else if(_mid1 != result._mid1) { return _mid1 < result._mid1; } else if(_mid2 != result._mid2) { return _mid2 < result._mid2; } else { return _max < result._max; } } int _min; int _mid1;//次最小 int _mid2;//次最大 int _max;}Result;class Solution {public: vector
> fourSum(vector
& nums, int target) { vector
> results; if(nums.empty() || nums.size() < 4) { return results; } int size = nums.size(); sort(nums.begin() , nums.end()); int sum; set
> setResult; //这里的关键是罗列的时候:我已经实现罗列的a<=b,后续确定的另外两个数c,d有:a <= b <= c <= d //这样罗列比如:a=A[1], b=A[3],那么是否c可以为A[2]?不可以,已经假定了顺序。那么也不会存在判重的问题 for(int i = 0 ; i < size - 2 ; i++) { int target_3 = target - nums.at(i); for(int j = i + 1 ; j < size - 1; j++) { int target_2 = target_3 - nums.at(j); int low = j + 1; int high = size - 1; while(low < high) { sum = nums.at(low) + nums.at(high); if(sum < target_2) { low++; } else if(sum > target_2) { high--; } else { Result result(nums.at(i) , nums.at(j) , nums.at(low) , nums.at(high)); setResult.insert(result); low++; high--; } } } } //返回结果 for(set
>::iterator it = setResult.begin() ; it != setResult.end() ; it++) { vector
vecResult; //vector
{nums[i],nums[j],nums[left],nums[right]} vecResult.push_back(it->_min); vecResult.push_back(it->_mid1); vecResult.push_back(it->_mid2); vecResult.push_back(it->_max); results.push_back(vecResult); } return results; }};void print(vector< vector
>& results){ if(results.empty()) { cout << "no result" << endl; return; } int size = results.size(); for(int i = 0 ; i < size ; i++) { vector
result = results.at(i); int len = result.size(); for(int j = 0; j < len ; j++) { cout << result.at(j) << " "; } cout << ","; } cout << endl;}void process(){ int num; vector
nums; vector< vector
> results; int value; int target; while(cin >> num >> target) { nums.clear(); for(int i = 0 ; i < num ; i++) { cin >> value; nums.push_back(value); } Solution solution; results = solution.fourSum(nums , target); print(results); }}int main(int argc , char* argv[]){ process(); getchar(); return 0;}

转载地址:http://shofn.baihongyu.com/

你可能感兴趣的文章
export 命令导出变量
查看>>
JAVA-快速接入第三方应用登录(QQ、微信、微博)
查看>>
解决Mysql-无法批量更新的问题
查看>>
Springboot-logback配色方案
查看>>
面试题-给定一个“flatten”Dictionary对象,根据键转换成嵌套字典对象
查看>>
用cookies实现主题背景颜色切换,保存选择的颜色
查看>>
用 node.js 开启一个 http服务,返回文件或信息
查看>>
【git】warning: adding embedded git repository
查看>>
git warning: LF will be replaced by CRLF in 解决办法
查看>>
python文件处理
查看>>
CentOS7制作本地yum源
查看>>
参考花书《深度学习》实现一个简易版PCA
查看>>
CSDN Markdown编辑器——文本颜色、大小、字体设计
查看>>
Looper源码分析
查看>>
MessageQueen源码分析
查看>>
Handler源码分析
查看>>
Git版本控制工具——背景介绍(一)
查看>>
Thread类的使用
查看>>
单元测试
查看>>
操作系统概述
查看>>