leetcode-Algorithms-15 |三数之和

原题

在这里插入图片描述

思路

有两个关键点

注意点一

怎么去重,我是将有序数字组合成字符串,再放入SET自动去重。

注意点二

超时,考虑双指针。

代码

代码我写了两种,第一种虽然有结果,但是执行超时,优化了一下,虽然还不是很快,但是已经比之前快了很多。

package leetcode.Algorithms;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;


public class Solution_15 {
    
    
    public static void main(String[] args) {
    
    
        int[] nums = {
    
    -1, 0, 1, 2, -1, -4};
        threeSum_update(nums);
    }

    public static List<List<Integer>> threeSum(int[] nums) {
    
    
        List<List<Integer>> ans = new ArrayList<List<Integer>>();

        if (nums == null || nums.length == 0 || nums.length < 2) {
    
    
            return ans;
        }

        //排序
        Arrays.sort(nums);
        HashSet<String> set1 = new HashSet<String>();
        //从大到0
        for (int i = nums.length - 1; i >= 0; i--) {
    
    
            int target = nums[i];//目标树
            //拆分为正负两部分
            if (target >= 0) {
    
    
                for (int j = 0; j < i; j++) {
    
    
                    for (int k = nums.length - 2; k > j; k--) {
    
    
                        if (nums[j] + nums[k] + target == 0 && i > k && k > j) {
    
    
                            if (set1.contains(String.valueOf(nums[i]) + String.valueOf(nums[j]) + String.valueOf(nums[k])) == false) {
    
    
                                ans.add(Arrays.asList(nums[j], nums[k], nums[i]));
                                set1.add(String.valueOf(nums[i]) + String.valueOf(nums[j]) + String.valueOf(nums[k]));
                            }
                        }
                    }
                }
            }
        }
        System.out.println(ans);
        return ans;
    }


    public static List<List<Integer>> threeSum_update(int[] nums) {
    
    
        List<List<Integer>> list = new ArrayList<List<Integer>>();

        if (nums == null || nums.length == 0 || nums.length < 2) {
    
    
            return list;
        }

        //排序
        Arrays.sort(nums);
        HashSet<String> set1 = new HashSet<String>();
        //从大到0
        for (int i = nums.length - 1; i >= 0; i--) {
    
    
            int l = 0;
            int r = i - 1;
            while (l < r) {
    
    
                if (nums[l] + nums[r] + nums[i] == 0) {
    
    
                    if (set1.contains(String.valueOf(nums[i]) + String.valueOf(nums[r]) + String.valueOf(nums[l])) == false) {
    
    
                        list.add(Arrays.asList(nums[i], nums[r], nums[l]));
                        set1.add(String.valueOf(nums[i]) + String.valueOf(nums[r]) + String.valueOf(nums[l]));
                    }
                    l++;
                } else if (nums[l] + nums[r] + nums[i] > 0) {
    
    
                    r--;
                } else if (nums[l] + nums[r] + nums[i] < 0) {
    
    
                    l++;
                }
            }
        }
        System.out.println(list);
        return list;
    }

}


猜你喜欢

转载自blog.csdn.net/qq_38173650/article/details/114876983