题目描述
解法一 暴力解法
万物都可以暴力,只不过一般用暴力解法都会超时 遍历出所有的子串数组 然后挑出选择条件的,然后再排除重复的即可。 不推荐效率很低很容易超时!
解法二 双指针
建立动态数组 List<List> res=new ArrayList<>(); 边界条件 length<3 return new ArrayList<>() 相当于python中的[] 其实这个和两数之和是一样的,只不过我们要排除掉重复的 先将数组进行排序 Arrays.sort(); 先用for循环 第一个数字肯定是负数 然后选择第一次出现的数字 后面再选择第二个数字 用left控制 第三个数字用 right控制
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
int length=nums.length;
List<List<Integer>>res=new ArrayList<List<Integer>>();
if (length<3)return new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<length;i++){
if(nums[i]>0)break;
if(i>0 &&nums[i]==nums[i-1] ){
continue;
}
int first=nums[i];
int left=i+1;
int right=length-1;
while(left<right){
if(nums[left]+nums[right]+first>0){
right--;
}
else if(nums[left]+nums[right]+first<0){
left++;
}
else{
List<Integer>list=new ArrayList<Integer>();
list.add(first);
list.add(nums[left]);
list.add(nums[right]);
res.add(list);
while(left<right&&nums[left]==nums[left+1]){
left++;
}
while(left<right&&nums[right]==nums[right-1]){
right--;
}
left++;
right--;
}
}
}
return res;
}
}
|