三数之和等于0问题优化
前面我们已经给出过三数之和等于0的代码,不过改代码在LeetCode上面超出时间限制,所以说,不能完全说解出该题,今天我们给出优解,
直接上代码:
思路:先对数组进行排序,用for循环控制一个变量i,另外两个j和k分别指向结尾和当前i的下一个位置,进行查找。
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> lists = new ArrayList<List<Integer>>();
if(nums.length > 2&& nums != null) {
for(int i = 0; i < nums.length -2&& nums[i]<=0; ) {//第一个值不可能大于零
int j = i+1;
int k = nums.length - 1;
while(j < k &&nums[k] >= 0) {
if(nums[i] + nums[j] + nums[k] == 0) {
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
lists.add(list);
j++;
k--;
while(j < k && nums[j-1] == nums[j]) {//从左到右找到和上一个不同的值
j++;
}
while(j < k && nums[k] == nums[k+1]) {//从右到左找到和上一个不同的值
k--;
}
}else if(nums[i] + nums[j] + nums[k] > 0) {
k--;
while(j < k && nums[k] == nums[k+1]) {
k--;
}
}else {
j++;
while(j < k && nums[j] == nums[j-1]) {
j++;
}
}
}
i++; //下标累加
while(i < nums.length -2 && nums[i] == nums[i-1]) {//找到和之前不同的下一个值
i++;
}
}
}
return lists;
}