leetcode链接:
https://leetcode.cn/problems/3sum/
方案一
暴力求解
结果:有重复解,后期也一定会时间超时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| List<List<Integer>> result1 = new ArrayList<>();
for (int i = 0; i < nums.length - 2; i++) { for (int j = i + 1; j < nums.length - 1; j++) { for (int j2 = j + 1; j2 < nums.length; j2++) { if (nums[i] + nums[j] + nums[j2] == 0) { List<Integer> le = new ArrayList<>(); le.add(nums[i]); le.add(nums[j]); le.add(nums[j2]); result1.add(le); } } } }
return result1;
|

方案二
先进行排序,再判断
结果: 超时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| List<List<Integer>> result1 = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; (nums[i] < 1 && i < nums.length - 2); i++) {
for (int j = i + 1; j < nums.length - 1; j++) { if (i!=0 && nums[i] == nums[i -1]) break;
for (int j2 = j + 1; j2 < nums.length; j2++) {
if (j!=i + 1 && (nums[j] == nums[j -1])) break;
if (nums[i] + nums[j] + nums[j2] == 0) {
if (j2!=j + 1 && nums[j2] == nums[j2 -1]) break;
List<Integer> le = new ArrayList<>(); le.add(nums[i]); le.add(nums[j]); le.add(nums[j2]); result1.add(le); } } } }
return result1;
|
方案三
根据题解得:先进行排序,再使用指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result1 = new ArrayList<>();
Arrays.sort(nums);
int letf,right; for (int i = 0; (nums[i] < 1 && i < nums.length - 2); i++) { if (i!=0 && nums[i] == nums[i -1]) continue; letf = i + 1; right = nums.length - 1; while (letf < right) { if (nums[right] + nums[letf] > -nums[i]){ right--; } else if (nums[right] + nums[letf] == -nums[i]) { List<Integer> le = new ArrayList<>(); le.add(nums[i]); le.add(nums[letf]); le.add(nums[right]); result1.add(le); while(nums[right] == nums[--right]) { if (right == 0) break; } while(nums[letf] == nums[++letf]) { if (letf == nums.length - 1) break; }
} else { letf ++; } } }
return result1; } }
|
结果
解答成功:
执行耗时:27 ms,击败了95.35% 的Java用户
内存消耗:50.4 MB,击败了9.59% 的Java用户
几乎最优方案
https://leetcode.cn/problems/3sum/solution/pai-xu-shuang-zhi-zhen-zhu-xing-jie-shi-python3-by/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> res = new ArrayList<>(); int len = nums.length; if(nums == null || len <3){ return res; } Arrays.sort(nums); for(int i = 0; i<len;i++){ if(nums[i]>0){ break; } if(i > 0 && nums[i] == nums[i-1]) continue; int l = i +1; int r = len-1; while(l<r){ int sum = nums[i] + nums[l] + nums[r]; if(sum==0){ 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--; } l++; r--; }else if(sum < 0){ l++; }else if(sum > 0){ r--; } } } return res; } }
|