二重ポインタ三数の和


タイトル
LeetCode 15. 三数の和
       n        nums,   nums           a,b,c ,   a + b + c = 0 ?         0         。

  :              。

 

   1:

  :nums = [-1,0,1,2,-1,-4]
  :[[-1,-1,2],[-1,0,1]]
   2:

  :nums = []
  :[]
   3:

  :nums = [0]
  :[]
 

  :

0 <= nums.length <= 3000
-105 <= nums[i] <= 105


問題を解く構想とアルゴリズム
ソート+ダブルポインタ
コード#コード#
class Solution {
     
    public List<List<Integer>> threeSum(int[] nums) {
     
        int n = nums.length;
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        //    a
        for (int first = 0; first < n; ++first) {
     
            //              
            if (first > 0 && nums[first] == nums[first - 1]) {
     
                continue;
            }
            // c                
            int third = n - 1;
            int target = -nums[first];
            //    b
            for (int second = first + 1; second < n; ++second) {
     
                //              
                if (second > first + 1 && nums[second] == nums[second - 1]) {
     
                    continue;
                }
                //      b      c       
                while (second < third && nums[second] + nums[third] > target) {
     
                    --third;
                }
                //       ,   b      
                //        a+b+c=0    b
                if (second == third) {
     
                    break;
                }
                if (nums[second] + nums[third] == target) {
     
                    List<Integer> list = new ArrayList<Integer>();
                    list.add(nums[first]);
                    list.add(nums[second]);
                    list.add(nums[third]);
                    ans.add(list);
                }
            }
        }
        return ans;
    }
}