*15. 3Sum (three pointers to two pointers), hashset

Given an array nums of n integers, are there elements abc in nums 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.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

Idea: Simplify this problem from O(n^3) to n square by using two pointers

iterate i and j = i+1 and k = n-1 (j and k are two pointers we would use)

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        //two pointers
        //set i and move j and k (if sum <0 j++ else k--)
        for(int i = 0; i<nums.length; i++){
            if (i != 0 && nums[i] == nums[i - 1]) continue; //*****
            int j = i+1;
            int k = nums.length-1;
            while(j<k){
                if(nums[i] + nums[j] + nums[k] == 0){
                    List<Integer> temp = new ArrayList<Integer>();
                    temp.add(nums[i]); temp.add(nums[j]);temp.add(nums[k]);
                    //if(!res.contains(temp))  //why add this make TLE ****
                        res.add(temp);
                    ++j;
                    //System.out.println("wei");
                    while (j < k && nums[j] == nums[j-1]) ++j; ****
                }else if(nums[i] + nums[j] + nums[k] < 0){
                    j++;
                }else {
                    k--;
                }
            }
        }
        return res;
    }
}

1.avoid the duplicate elements -1 -1 (for the same values, there are same results)

2. avoid using contains because of O(n), that is the reason why we need check the duplicate elements manually instead of using contains

Solution 2: using hashmap: n^2*lgn

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        for(int i = 0; i < nums.length; i++){
            if(i!=0 && nums[i-1] == nums[i]) continue;
            Set<Integer> set = new HashSet<>(); // no duplicate elements
            for(int j = i+1; j<nums.length; j++){// nums[j] : b and c means: count all nums[i] as c
                if(set.contains(-nums[i]-nums[j])){ // c
                    List<Integer> temp = new ArrayList<>();
                    temp.add(nums[i]);temp.add(nums[j]);temp.add(-nums[i]-nums[j]);
                    res.add(temp);
                    //avoid the duplicate elemnts
                    ++j;
                    while(j < nums.length && nums[j-1]==nums[j]) j++;
                    --j;
                }
                if(j<nums.length)
                set.add(nums[j]);
            }
        }
        return res;
    }
}

hashset

how to using two loop to represent three numbers.

1. treat all nums[j] as c(the third elemnts)

2. As a+b+c = 0, c = -a-b, we need find a and b to satisfy the requirement

原文地址:https://www.cnblogs.com/stiles/p/leetcode15.html

时间: 2024-10-15 21:38:40

*15. 3Sum (three pointers to two pointers), hashset的相关文章

1. Two Sum&amp;&amp;15. 3Sum&amp;&amp;18. 4Sum

题目: 1. Two Sum Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Given nums = [2, 7, 1

Leetcode之15. 3Sum (medium)

15. 3Sum (medium) 描述 Given an array nums of n integers, are there elements a, b, c in nums 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. Example

15.3sum(Nsum总结)

如果不用hashmap解决2sum,而是把2sum看成nSum中的一部分,那么就需要用two pointers来解决问题. 2sum伪代码: 1. 先对给定的数组进行排序 2. walker指第一个元素,runner指最后一个元素 3.当walker小于runner: 1)如果walker和runner的和等于target,那么: (1)如果只需要一对解,记录答案,break (2)如果需要所有解,那么walker++, runner-- 2) else如果和小于target,walker++

LeetCode 15. 3Sum(三数之和)

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,

15. 3Sum - Medium

Given an array nums of n integers, are there elements a, b, c in nums 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. Example: Given array nums =

[LeetCode] 15. 3Sum

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,

【leetcode】15. 3Sum

题目描述: 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. 解题分析: 这道题注意一下几点即可: 1,先固定前两个数的位置,移动第三个数,这样的查找方式不会有数字组合的遗漏: 2,要考虑到数组元素有重复的情况下的处理. 3,若先为数组排

15. 3Sum java solutions

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,

leetcode 15. 3Sum 双指针

题目链接 给n个数, 找出三个数相加结果为0的所有的组, 不可重复. 用双指针的思想,O(n^2)暴力的找, 注意判重复. 1 class Solution { 2 public: 3 vector<vector<int>> threeSum(vector<int>& nums) { 4 int sz = nums.size(); 5 vector <vector<int> > ans; 6 vector <int> tmp;