三数之和(leetcode 15)

一:解题思路

方法一:暴力破解法 Time:O(n^3),Space:(1)

方法二:利用双指针法可以优化时间复杂度,Time:O(n^2),Space:O(1)

二:完整代码示例 (C、C++、Java、Python)

方法一C:

方法二C:

 

方法一C++:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        if (nums.size() < 3) return result;
        set<vector<int>> set;
        sort(nums.begin(),nums.end());

        for (int i = 0; i < nums.size(); i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                for (int k = j + 1; k < nums.size(); k++) {
                    if (nums[i] + nums[j] + nums[k] == 0) {
                        vector<int> elem = {nums[i],nums[j],nums[k]};
                        set.insert(elem);
                    }
                }
            }
        }

        for (auto it = set.begin(); it != set.end(); *it++) {
            result.push_back(*it);
        }

        return result;
    }
};

方法一C++:(另外一种写法)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        if (nums.size() < 3) return result;
        set<vector<int>> set;
        sort(nums.begin(),nums.end());

        for (int i = 0; i < nums.size(); i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                for (int k = j + 1; k < nums.size(); k++) {
                    if (nums[i] + nums[j] + nums[k] == 0) {
                        vector<int> elem = {nums[i],nums[j],nums[k]};
                        if (set.count(elem) > 0) continue;
                        set.insert(elem);
                        result.push_back(elem);
                    }
                }
            }
        }

        /*for (auto it = set.begin(); it != set.end(); *it++) {
            result.push_back(*it);
        }*/

        return result;
    }
};

方法二C++:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        if (nums.size() < 3) return result;
        sort(nums.begin(),nums.end());

        for (int k = nums.size() - 1; k >= 2; k--) {
            if (3 * nums[k] < 0) break;
            int i = 0;
            int j = k - 1;
            int newTarget = 0 - (nums[k]);

            while (i < j) {
                if (nums[i] + nums[j] == newTarget) {
                    vector<int> elem = {nums[i],nums[j],nums[k]};
                    while (i < j && nums[i] == nums[i + 1]) i++;
                    while (i < j && nums[j] == nums[j - 1]) j--;
                    i++;
                    j--;
                    result.push_back(elem);
                }
                else if (nums[i] + nums[j] < newTarget) i++;
                else j--;
            }
            while (k >= 2 && nums[k] == nums[k - 1]) k--;
        }

        return result;
    }
};

方法一Java:

class Solution {
        public List<List<Integer>> threeSum(int[] nums) {
               List<List<Integer>> result=new ArrayList<>();
               if (nums == null || nums.length == 0) return result;
               Set<List<Integer>> set=new HashSet<>();
               Arrays.sort(nums);
               
               for (int i=0;i<nums.length;i++) {
                   for (int j=i+1;j<nums.length;j++) {
                       for (int k=j+1;k<nums.length;k++) {
                           if (nums[i]+nums[j]+nums[k] == 0) {
                               List<Integer> elem=Arrays.asList(nums[i],nums[j],nums[k]);
                               if (set.contains(elem)) continue;
                               set.add(elem);
                               result.add(elem);
                           }
                       }
                   }
               }
               
               return result;
        }
    }

方法二Java:

class Solution {
        public List<List<Integer>> threeSum(int[] nums) {
               List<List<Integer>> result=new ArrayList<>();
               if(nums==null || nums.length==0) return result;
               Arrays.sort(nums);

               for(int k=nums.length-1;k>=2;k--) {
                   if(3*nums[k]<0) break;
                   int i=0;
                   int j=k-1;
                   int newTarget=0-nums[k];
                   while(i<j){
                       if(nums[i]+nums[j]==newTarget){
                           result.add(Arrays.asList(nums[i],nums[j],nums[k]));
                           while(i<j && nums[i]==nums[i+1]) i++;
                           while(i<j && nums[j]==nums[j-1]) j--;
                           i++;
                           j--;
                       }
                       else if (nums[i]+nums[j]<newTarget) i++;
                       else j--;
                   }
                   while(k>=2 && nums[k]==nums[k-1]) k--;
               }
               

               return result;
        }
    }

 方法一Python:

 

from typing import List
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        result=[]
        n=len(nums)
        nums.sort()
        if not nums or n<3:return result
        hashset=set()

        for i in range(n):
            for j in range(i+1,n):
                for k in range(j+1,n):
                    if(nums[i]+nums[j]+nums[k]==0):
                        elem=(nums[i],nums[j],nums[k])
                        if elem not in hashset:
                            hashset.add(elem)
                            result.append(elem)

        return result

 

方法二python:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        result=[]
        n=len(nums)
        nums.sort()
        if not nums or n<3:
            return result
        k=n-1
        while k>=2:
            if 3*nums[k]<0:
                break
            i=0
            j=k-1
            target=0-nums[k]
            while i<j:
                if nums[i]+nums[j]==target:
                    elem=(nums[i],nums[j],nums[k])
                    result.append(elem)
                    while (i<j) & (nums[i]==nums[i+1]):
                        i+=1
                    while (i<j) & (nums[j]==nums[j-1]):
                        j-=1
                    i+=1
                    j-=1
                elif nums[i]+nums[j]<target:
                    i+=1
                else:
                    j-=1
            while (k>=2) & (nums[k]==nums[k-1]):
                k-=1
            k-=1
        return result

方法二Python(另外一种解法):

from typing import List
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        result=[]
        n=len(nums)
        nums.sort()
        if not nums or n<3:
            return result
        k=n-1
        while k>=2:
            if 3*nums[k]<0: break
            newTarget=0-nums[k]
            i=0
            j=k-1
            while i<j:
                if nums[i]+nums[j]==newTarget:
                    result.append([nums[i],nums[j],nums[k]])
                    while i<j and nums[i]==nums[i+1]:
                        i+=1
                    while i<j and nums[j]==nums[j-1]:
                        j-=1
                    i+=1
                    j-=1
                elif nums[i]+nums[j]<newTarget:
                    i+=1
                else:
                    j-=1
            while k>=2 and nums[k]==nums[k-1]:
                k-=1
            k-=1
            
        return result
posted @ 2020-04-07 21:10  repinkply  阅读(477)  评论(0)    收藏  举报