力扣15 三数之和

三数之和

原题链接

image-20211212222437095

image-20211212222624065

思路

  1. 这是一道双指针的题,时间复杂度为O(n2)。空间复杂度为O(1)。

  2. 最开始我以为是一个组合问题,用到dfs,但是无法找出重复的,而且时间复杂度极高,所以思路很重要。

细节

  1. 对于 if else if else 的格式,顺序很重要,要把大概率出现的放在最开始,能极大地加快速度。
  2. 对于特殊情况,单列出来 比方说第一个数组
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {  
        ArrayList<List<Integer>> res = new ArrayList();   
       
       //定义第一个指针 start
        int start = 0;
       //自带的双轴快排
        Arrays.sort(nums);   

       //循环遍历数组第一个位置的指针,注意终止条件,防止数组越界。
        while(start<=nums.length-3){

            if(nums[start]>0)break;
            //排除了特殊的例子(数组第一个数就大于零的话直接pass,对比测试了一下加这个能快1ms)
           
            //定义第二指针left,刷新第三指针end为最末尾,设置目标值target
                int end = nums.length-1;
                int target = -nums[start];
                int left = start+1;
            //内部双指针     
                 while(left<end){
                     //小于目标值 left++
                    if(nums[left]+nums[end]<target){ left++;}
                    //大于目标值 end--
                      else if(nums[left]+nums[end]>target){end--;}
                    //等于目标值 加入list,同时剔除相同的元素。
                      else{
                        res.add(Arrays.asList(-target, nums[left], nums[end]));
                        while(left<end&&nums[left+1]==nums[left]){left++;}
                                left++;
                        while(left<end&&nums[end-1]==nums[end]){end--;}
                                end--;
                          }
            } 
            //如果遇到相同的元素,跳过。         
            while(start<end&&nums[start+1]==nums[start]){start++;}
            start++;
            }
    return res;
    }
}
posted @ 2021-12-12 22:33  淮南枳  阅读(27)  评论(0)    收藏  举报