15. 三数之和
https://leetcode-cn.com/problems/3sum/
方法一:
利用暴力破解
注意主要的是去重复
- if (i > 0 && nums[i - 1] == nums[i]) continue;
超时
public static List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
ArrayList<List<Integer>> inList = new ArrayList<>();
for (int i = 0; i < nums.length - 2; i++) {
if (nums[i] > 0) break;//第一个数大于零 结束
//去重复
if (i > 0 && nums[i - 1] == nums[i]) continue;
for (int j = i + 1; j < nums.length - 1; j++) {
if (j > i + 1 && nums[j - 1] == nums[j]) continue;
for (int k = j + 1; k < nums.length; k++) {
if (k > j + 1 && nums[k - 1] == nums[k]) continue; //去重原理同j
if ((nums[i] + nums[j] + nums[k]) == 0) {
List<Integer> curr = new ArrayList<>();
curr.add(nums[i]);
curr.add(nums[j]);
curr.add(nums[k]);
inList.add(curr);
}
}
}
}
方法二:
利用集合的特性将 方法一中的一个for循环代替
-
先排序
-
利用hashmap的特性判断是否在数组中
-
先将每个数组遍历放到map中,最后一的数字用map集合进行进行遍历
-
注意各种去重复的放方法
if (nums[i] > 0) break; if (nums[i] + nums[j] > 0) break; //去重原理同i,j必须大于i + 1,因为j是从i + 1开始的,必须要大于开始值才能后退一步 if (j > i + 1 && nums[j - 1] == nums[j]) continue;
public static List<List<Integer>> threeSum1(int[] nums) {
Arrays.sort(nums);
ArrayList<List<Integer>> inList = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length - 2; i++) {
if (nums[i] > 0) break;
if (i > 0 && nums[i - 1] == nums[i]) continue;
for (int j = i + 1; j < nums.length - 1; j++) {
if (nums[i] + nums[j] > 0) break;
//去重原理同i,j必须大于i + 1,因为j是从i + 1开始的,必须要大于开始值才能后退一步
if (j > i + 1 && nums[j - 1] == nums[j]) continue;
int z = 0 - nums[i] - nums[j];
if (map.containsKey(z)) {
List<Integer> curr = new ArrayList<>();
curr.add(nums[i]);
curr.add(nums[j]);
curr.add(z);
inList.add(curr);
}
}
}
return inList;
}
方法三:
利用三指针的方法
public static List<List<Integer>> threeSum2(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if (nums.length == 0 && nums.length < 3) {
return result;
}
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (i >= 1 && nums[i] == nums[i - 1]) continue;
int a = i + 1;
int b = nums.length - 1;
while (a < b) {
if ((nums[i] + nums[a] + nums[b]) == 0) {
List<Integer> curr = new ArrayList<>();
curr.add(nums[i]);
curr.add(nums[a]);
curr.add(nums[b]);
result.add(curr);
a++;
b--;
while (a < nums.length && nums[a] == nums[a - 1]) a++;
while (b > a && nums[b] == nums[b + 1]) b--;
} else if (nums[a] + nums[b] < (-nums[i])) {
a++;
} else {
b--;
}
}
}
return result;
}