✘ Wrong Answer
✘ 130/313 cases passed (N/A)
✘ testcase: '[]'
✘ answer: null
✘ expected_answer: []
✘ stdout:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
if(nums.length < 3)
return null;
List<List<Integer> > res = new ArrayList<List<Integer>>();
//先将nums排序
Arrays.sort(nums);
//双指针法
for(int i=0; i<nums.length-2; i++){
//结果序列不能重复,故而相同的数字不再计算
if(i-1>=0 && nums[i] == nums[i-1])
continue;
int l = i+1;
int r = nums.length-1;
//List<Integer> res_tmp = new ArrayList<>();
while(l<r){
int tmp = nums[i] + nums[l] + nums[r];
if(tmp > 0)
r--;
else if(tmp < 0)
l++;
else{
res.add(Arrays.asList(nums[i],nums[l],nums[r] ) );
r--;
l++;
}
}
}
return res;
}
}
修正错误,将前几句改为:
List<List<Integer> > res = new ArrayList<List<Integer>>();
if(nums.length < 3)
return res;
//List<List<Integer> > res = new ArrayList<List<Integer>>();
然后新bug出现了:
Input: [-2,0,0,2,2]
Output: [[-2,0,2],[-2,0,2]]
Expected: [[-2,0,2]]
继续修改:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer> > res = new ArrayList<List<Integer>>();
if(nums.length < 3)
return res;
//List<List<Integer> > res = new ArrayList<List<Integer>>();
//先将nums排序
Arrays.sort(nums);
//双指针法
for(int i=0; i<nums.length-2; i++){
//结果序列不能重复,故而相同的数字不再计算
if(i-1>=0 && nums[i] == nums[i-1])
continue;
int l = i+1;
int r = nums.length-1;
//List<Integer> res_tmp = new ArrayList<>();
while(l<r){
if((l-1>=0 && nums[l] == nums[l-1]) || (r-1>=0 && nums[r] == nums[r-1]) )
continue;
···
}
return res;
}
}
然后超时了!惊不惊喜,意不意外。仔细看一下,可以发现程序运行卡在了while中的第一个continue这里。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer> > res = new ArrayList<List<Integer>>();
if(nums.length < 3)
return res;
//List<List<Integer> > res = new ArrayList<List<Integer>>();
//先将nums排序
Arrays.sort(nums);
//双指针法
for(int i=0; i<nums.length-2; i++){
//结果序列不能重复,故而相同的数字不再计算
if(i-1>=0 && nums[i] == nums[i-1])
continue;
int l = i+1;
int r = nums.length-1;
//List<Integer> res_tmp = new ArrayList<>();
while(l<r){
int tmp = nums[i] + nums[l] + nums[r];
if(tmp > 0)
r--;
else if(tmp < 0)
l++;
else{
res.add(Arrays.asList(nums[i],nums[l],nums[r] ) );
while(l<r && nums[l] == nums[l+1] )
l++;
while(l<r && nums[r] == nums[r-1] )
r--;
r--;
l++;
}
}
}
return res;
}
}
Runtime: 31 ms, faster than 88.64% of Java online submissions for 3Sum.
Memory Usage: 49 MB, less than 45.42% of Java online submissions for 3Sum.