15. 3Sum
来源:互联网 发布:me042j a支持什么网络 编辑:程序博客网 时间:2024/06/16 10:57
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],A solution set is:[ [-1, 0, 1], [-1, -1, 2]]
首先对数组从小到大排序,时间复杂度为O(nlogn)。
3Sum和核心是2Sum。如果是2Sum,只需两个变量j,k,分别从数组的左右两边开始循环,
(1)如果 num[j] + num[k] < 0,说明不等式左边的和太小了,此时应将 j 右移1位,即j++
(2)如果 num[j] + num[k] > 0,说明不等式左边的和太大了,此时应将 k 左移1位,即k–
在2Sum的基础上,外部再加一个从1到num.length-2的循环,作为第三个数可能出现的位置,构成3Sum。
public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> result = new ArrayList<List<Integer>>(); for(int i = 0; i < nums.length - 2; i++) { if(i > 0 && nums[i] == nums[i-1]) continue; // 避免产生重复的解 int j = i + 1; int k = nums.length - 1; while(j < k) { int sum = nums[i] + nums[j] + nums[k]; if(sum == 0) { result.add(Arrays.asList(nums[i], nums[j], nums[k])); j++; k--; while(j < k && nums[j] == nums[j-1]) j++; // 避免产生重复的解 while(j < k && nums[k] == nums[k+1]) k--; // 避免产生重复的解 }else if(sum < 0) { j++; }else { k--; } } } return result; }
阅读全文
0 0
- 15. 3Sum && 16 sum closet && 18 4sum
- 15. 3Sum 和 18. 4Sum
- 1. Two Sum&15. 3Sum
- LeetCode 15. 3Sum
- LeetCode --- 15. 3Sum
- [Leetcode] 15. 3Sum
- 【LeetCode】15. 3Sum
- 15. 3Sum
- 【leetcode】15. 3sum
- 【leetcode】15. 3Sum
- 15. 3Sum
- [leetcode] 15. 3Sum
- 15. 3Sum
- 15. 3Sum
- 15. 3Sum
- 15. 3Sum
- 15. 3Sum
- leetcode 15. 3Sum
- Machine Learning第九讲[推荐系统] --(二)协同过滤
- C++启动可执行文件(.exe)的方法CreateProcess
- 下拦菜单技术演示---修改文本颜色
- 三维渲染中的裁剪总汇
- android studio 适配android7.0 android 6.0拍照调用系统裁剪工具实现头像上传功能
- 15. 3Sum
- MQTT 物联网协议
- 重写HorizontalScrollView实现代码控制水平滚动定位
- Intel笑了: 这才是骁龙835 Win10电脑的真实性能!
- CSDN日报20170517 ——《怎样和虐死人的老项目谈恋爱》
- Android Things SDK用法之PWM篇
- Zookeeper 集群搭建
- JS代码规范工具对比
- 【Android】Audio音频输出通道切换