leetcode
来源:互联网 发布:腾讯足球数据库 编辑:程序博客网 时间:2024/05/15 00:36
4Sum
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]]
Solution:
public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> result = new ArrayList<>(); if (nums == null || nums.length < 4) { return result; } Arrays.sort(nums); int max = nums[nums.length - 1]; if (4 * max < target || 4 * nums[0] > target) { return result; } for (int i = 0; i < nums.length; i++) { int x = nums[i]; if (i > 0 && x == nums[i - 1]) { continue; } else if (x + 3 * max < target) { continue; } else if (x + 3 * nums[0] > target) { break; } else if (x * 4 == target) { if (i + 3 < nums.length && nums[i + 3] == x) { result.add(Arrays.asList(x, x, x, x)); } } else { threeSum(nums, target - x, i + 1, result, x); } } return result; } private void threeSum(int[] nums, int target, int begin, List<List<Integer>> result, int x1) { if (begin + 2 >= nums.length) { return; } int max = nums[nums.length - 1]; if (3 * nums[begin] > target) { return; } for (int i = begin; i < nums.length; i++) { int x = nums[i]; if (i > begin && x == nums[i - 1]) { continue; } else if (x + 2 * max < target) { continue; } else if (x + 2 * nums[begin] > target) { break; } else if (x * 3 == target) { if (i + 2 < nums.length && nums[i + 2] == x) { result.add(Arrays.asList(x1, x, x, x)); } } else { twoSum(nums, target - x, i + 1, result, x1, x); } } } private void twoSum(int[] nums, int target, int begin, List<List<Integer>> result, int x1, int x2) { if (begin + 1 >= nums.length) { return; } if (2 * nums[begin] > target) { return; } int i = begin, j = nums.length - 1, sum, k; while (i < j) { sum = nums[i] + nums[j]; if (sum == target) { result.add(Arrays.asList(x1, x2, nums[i], nums[j])); k = nums[i]; while (++i < j && k == nums[i]) ; k = nums[j]; while (i < --j && k == nums[j]) ; } else if (sum > target) { j--; } else { i++; } } return; }
0 0
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode
- leetcode:
- leetcode:
- LeetCode
- leetcode
- LEETCODE
- leetcode
- leetCode
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode:
- leetcode
- AJAX学习之路(三)
- 深入解析C++中的构造函数和析构函数
- @RequestBody:Unrecognized field , not marked as ignorable问题
- poj 1836 Alignment (最长上升子序列 N*log(n))@
- 我的Android进阶之旅------>android Matrix图片随意的放大缩小,拖动
- leetcode
- java se第三章 课堂笔记
- 阿里巴巴2017暑期实习生招聘面经
- leetcode
- 【Leetcode题解】136.Single Number
- elasticsearch全局检索多分词器匹配
- POJ 1321 棋盘问题 (DFS)
- 前端将图片二进制流显示在html端
- 练习ssm框架整合,做增删改查操作