[Leetcode] 4Sum
来源:互联网 发布:手机提示网络错误 编辑:程序博客网 时间:2024/06/09 08:23
题目:
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:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- The solution set must not contain duplicate quadruplets.
For example, given array S = {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)
思路:排序 + 双指针。
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()); for (int i = 0; i < (int)num.size() - 3; ++i) { if (i > 0 && num[i] == num[i-1]) continue; //avoid duplicate num[i] for (int j = i + 1; j < num.size(); ++j) { if (j > i + 1 && num[j] == num[j-1]) continue; //avoid duplicate num[j] int start = j + 1; int end = (int)num.size() - 1; while (start < end) { int current_sum = num[i] + num[j] + num[start] + num[end]; if (current_sum == target) { //find target, add to the result vector<int> new_result; new_result.push_back(num[i]); new_result.push_back(num[j]); new_result.push_back(num[start]); new_result.push_back(num[end]); result.push_back(new_result); do { //move start to next different value start++; } while (start < end && num[start] == num[start-1]); do { //move end to next different value end--; } while (end > start && num[end] == num[end+1]); } else if (current_sum < target) { start++; } else { end--; } } } } return result; }};
总结:避免重复: i每次递增到一个新的num[i]值为止;j每次递增到一个新的num[j]值为止;start end 递增到一个新的num[start] num[end]值为止。复杂度O(n^3),brute force复杂度O(n^4).
0 0
- 【Leetcode】4Sum (Sum)
- leetcode 2 sum 3sum 4sum
- Leetcode 2SUM-3SUM-4SUM
- Leetcode-2sum,3sum,4sum
- leetcode 2 sum & 3 sum & 4 sum
- [LeetCode] 2Sum, 3Sum, 4Sum, 3SUm closet
- [LeetCode] K sum(2Sum、3Sum、4Sum)
- leetcode--sum集合:2sum,3sum,4sum
- leetcode --- 2 sum , 3 sum , 4 sum , k sum problem
- LeetCode: 4 Sum
- LeetCode: 4Sum
- LeetCode 4Sum
- Leetcode: 4SUM
- 【leetcode】 4 sum
- LeetCode 4Sum
- leetcode 44: 4Sum
- [Leetcode] 4 Sum [Unsolved]
- 【leetcode】4Sum
- 关于Java编程中使用RandomAccessFile进行大文件分割的探讨
- oracle undo 复杂度--oracle核心技术读书笔记四
- 初创型服务运营--问题、思路与实践
- linux基本命令
- exp/imp和expdp/impdp
- [Leetcode] 4Sum
- 链表排序
- C++中int *p[4]和 int (*q)[4]的区别
- 彻底搞懂Oracle字符集
- 指针-形参与实参-函数传参
- string 输入
- Oracle 字符集的查看和修改
- HDU 4022 Bombing
- 安卓开发笔记,mars视频教程18中无法下载文件