18. 4Sum
来源:互联网 发布:广州多想网络 骗 编辑:程序博客网 时间:2024/06/16 04:37
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.A solution set is:[ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2]]
思路1:将数组排序,然后可以将问题降到O(N^3)的复杂度
vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; if (nums.size() < 4)return res; sort(nums.begin(), nums.end()); for (int i = 0; i < nums.size() - 3; i++){ //去重操作 if (i > 0 && nums[i - 1] == nums[i])continue; for (int j = i + 1; j < nums.size() - 2; j++){ //去重操作 if (j > i + 1 && nums[j] == nums[j - 1])continue; int low = j + 1, high = nums.size() - 1; int temp = nums[i] + nums[j]; while (low < high){ if (temp + nums[low] + nums[high] > target)high--; else if (temp + nums[low] + nums[high] < target)low++; else { res.push_back({ nums[i], nums[j], nums[low], nums[high] }); low++, high--; while (low < high && nums[low] == nums[low - 1])low++; while (low < high && nums[high] == nums[high + 1])high--; } } } } return res;}
思路2:在第一层循环和第二层循环多一些判断,可以减少算法的循环次数
vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; if (nums.size() < 4)return res; sort(nums.begin(), nums.end()); int len = nums.size(); for (int i = 0; i < nums.size() - 3; i++){ //在此处判断是否重复以及是否有越界或小于target操作 if (i > 0 && nums[i - 1] == nums[i])continue; if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target)break; if (nums[i] + nums[len - 1] + nums[len - 2] + nums[len - 3] < target)continue; for (int j = i + 1; j < nums.size() - 2; j++){ //在此处判断是否重复以及是否有越界或小于target操作 if (j > i + 1 && nums[j] == nums[j - 1])continue; if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target)break; if (nums[i] + nums[j] + nums[len - 1] + nums[len - 2] < target)continue; int low = j + 1, high = nums.size() - 1; int temp = nums[i] + nums[j]; while (low < high){ int sum = temp + nums[low] + nums[high]; if (sum > target)high--; else if (sum < target)low++; else { res.push_back({ nums[i], nums[j], nums[low], nums[high] }); low++, high--; while (low < high && nums[low] == nums[low - 1])low++; while (low < high && nums[high] == nums[high + 1])high--; } } } } return res;}
阅读全文
0 0
- 15. 3Sum 和 18. 4Sum
- LeetCode --- 18. 4Sum
- [Leetcode] 18. 4Sum
- 18. 4Sum
- 18. 4Sum
- 18. 4Sum
- 18. 4Sum
- 18. 4Sum
- 18. 4Sum
- leetcode 18. 4Sum
- 18. 4Sum
- 18. 4Sum
- 18. 4Sum
- 18. 4Sum LeetCode
- 18. 4Sum
- leetcode 18. 4Sum
- 18. 4Sum
- 18. 4Sum
- MySQL如何添加外键
- 模态窗口
- Maven构建聚合项目
- C#实例化一个对象的方法
- redis-整数集合
- 18. 4Sum
- 1. 线性结构--线性表
- 设计模式之装饰模式
- jsonp跨域请求
- 基于Qt的软件框架设计
- 分类模型的评估方法-正确率(Accuracy)
- 0. 基本概念
- python的xlrd&xlwt
- JFrame与Frame的区别