2. 三数之和(数组、hashset)

 

 

思路及算法:

该题与第一题的“两数之和”相似,三数之和为0,不就是两数之和为第三个数的相反数吗?因为不能重复,所以,首先进行了一遍排序;其次,在枚举的时候判断了本次的第三个数的值是否与上一次的相同;再次,在寻找hashset时,判断当前的num[ j ]是否重复;最后,在枚举完一个第三个数之后,清空hashset。本题的答题思想与第一题类似,难度在于不可重复

 

代码:

 1 Java:
 2 class Solution {
 3     public List<List<Integer>> threeSum(int [] nums) {
 4         //从小到大排序
 5         Arrays.sort(nums);
 6         //设置剩下两个数字的目标值
 7         int target = 0;
 8         //建立返回的list
 9         List<List<Integer>> result = new LinkedList<>();
10         //定义hashset
11         Set<Integer> hashset = new HashSet<>();
12         for(int i = 0;i < nums.length - 2 ; i++){
13             // 需要和上一次枚举的数不相同
14             if ( i > 0 && nums[ i ] == nums[ i - 1]) {
15                 continue;
16             }
17             target = 0 - nums[i];
18             //pre为上一个符合条件的num[j],定义为Integer.MAX_VALUE是为了避免与输入冲突
19             int pre = Integer.MAX_VALUE;
20             for(int j = i + 1; j < nums.length ; j++){
21                 //hashset中需要寻找的值
22                 int other = target - nums[j];
23                 if (hashset.contains(other)) {
24                     //判断当前的num[j]是否重复
25                     if(pre == nums[j]){
26                         continue;
27                     }
28                     result.add(new LinkedList<>(Arrays.asList(nums[i], other , nums[j] )));
29                     pre = nums[j];
30                 }
31                 //未找到对应的other值,就将当前nums[j]插入hashset
32                 hashset.add(nums[j]);
33             }
34             //清空hash表
35             hashset.clear();
36         }
37         return result;
38     }
39 }

复杂度分析:

  • 时间复杂度:,其中N是数组中的元素数量。排序时间复杂度是,然后hashset是。
  • 空间复杂度:。hashset中最多需要存n-2个数。

 

提交结果:

 

posted @ 2020-11-18 16:49  北漂的尘埃  阅读(228)  评论(0编辑  收藏  举报