思路
利用双个移动的指针left以及right,还有一个固定的指针i,这样可以巧妙地减少时间复杂度。
解题过程
首先利用set的无序性,再对其进行排序,这样在进行处理的时候,我们可以对求和进行判断,如果大于零,我们可以移动右指针,如果小于零,我们可以移动左指针,如果等于零,我们可以同时移动做右指针,再去判断是否有相等的值,这样我们可以得到。
复杂度
- 时间复杂度: O(n2)O(n^2) O(n2)
- 空间复杂度: O(n)O(n) O(n)
Code
Java
class·Solution·{
····public·List<List<Integer>>·threeSum(int[]·nums)·{
········Set<List<Integer>>·resultSet·=·new·HashSet<>();
········Arrays.sort(nums);
········int·nums_length=nums.length;
········for(int·i·=0;i<nums_length-2;i++){
············if·(i·>·0·&&·nums[i]·==·nums[i·-·1])·continue;
············int·left=i+1,right·=nums_length-1;
············for·(;·left<right·;·)·{
················if(left>i+1&&nums[left]==nums[left-1]){
····················left++;
····················continue;
················}
················if(right<nums_length-1&&nums[right]==nums[right+1]){
····················right--;
····················continue;
················}
················if(nums[right]+nums[left]+nums[i]==0){
····················resultSet.add(Arrays.asList(nums[i],··nums[left],·nums[right]));
················}
················else·if·((nums[right]+nums[left]+nums[i]>0)){
····················right--;
····················continue;
················}·else··{
····················left++;
····················continue;
················}
················left++;
················right--;
············}
········}
········return·new·ArrayList<>(resultSet);
····}
}
1426

被折叠的 条评论
为什么被折叠?



