Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public List<List<Integer>> threeSum(int[] num) {
- Arrays.sort(num);
- List<List<Integer>> res = new LinkedList<>();
- for (int i = 0; i < num.length-2; i++) {
- if (i == 0 || (i > 0 && num[i] != num[i-1])) {
- int lo = i+1, hi = num.length-1, sum = 0 - num[i];
- while (lo < hi) {
- if (num[lo] + num[hi] == sum) {
- res.add(Arrays.asList(num[i], num[lo], num[hi]));
- while (lo < hi && num[lo] == num[lo+1]) lo++;
- while (lo < hi && num[hi] == num[hi-1]) hi--;
- lo++; hi--;
- } else if (num[lo] + num[hi] < sum) lo++;
- else hi--;
- }
- }
- }
- return res;
- }
- var mysort = function(a, b) {
- return a-b;
- }
- var threeSum = function(ns) {
- // everything is sorted
- ns.sort(mysort);
- // acc
- let res = [];
- // loop all #, but we keep last 2 elements
- for (let i = 0; i < ns.length-2; i++) {
- // 1. i === 0, rm 1st element
- // 2. same same skip
- if (i === 0 || (i > 0 && ns[i] !== ns[i-1])) {
- //if (true) {
- // the 2nd element
- let lo = i+1;
- // the end element
- let hi = ns.length-1;
- // remove the 1st element
- let sum = 0 - ns[i];
- // bi search
- while (lo < hi) {
- console.log(lo, hi, ns[lo], ns[hi], sum)
- // bi search: 2nd element + end element === sum
- if ((ns[lo] + ns[hi]) === sum) {
- console.log('push');
- res.push([ns[i], ns[lo], ns[hi]]);
- // skip: lo < hi, lo skip equal
- while (lo < hi && ns[lo] === ns[lo+1]) lo++;
- // skip: lo < hi, hi skip equal
- while (lo < hi && ns[hi] === ns[hi-1]) hi--;
- // closer
- lo++;
- // closer
- hi--;
- }
- else if (ns[lo] + ns[hi] < sum)
- lo++; // lo + hi < sum, lo++
- else
- hi--; // lo + hi > sum, hi--
- }
- }
- return res;
- }
- }
- [-1,0,1,2,-1,-4]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement