三数之和(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

浙公网安备 33010602011771号