1. 程式人生 > >【LeetCode】15. 3Sum

【LeetCode】15. 3Sum

1. 題目描述:

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]

2. 思路分析:

題目的意思是找到陣列中所有3個和為0的數,並且不能重複。

該題可以轉化成Two Sum的思路去解決。先固定一個數,然後從陣列中剩下的數中查詢和為該數負值(target)得2個數,則轉化成了Two Sum問題:先排序陣列,使兩個指標分別指向首尾的兩個數,如果這兩個數和等於target,則找到,如果小於target則右移左指標,如果大於target則左移右指標。

關鍵是題目要求去重,所以每次移動指標的時候要判斷一下是否和上一個數相同,如果相同則繼續移動。

3. Java程式碼:

程式碼:

public static List<List<Integer>>
threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { // 用於去重 if (i != 0 && nums[i] == nums[i - 1]) { continue; } // 轉化成Two Sum 問題 int target =
-nums[i]; int left = i + 1; int right = nums.length - 1; while (left < right) { int sum = nums[left] + nums[right]; if (sum == target) { List<Integer> triplets = Arrays.asList(nums[i], nums[left], nums[right]); result.add(triplets); left++; right--; // 用於去重 while (left < right && nums[left] == nums[left - 1]) { left++; } while (left < right && nums[right] == nums[right + 1]) { right--; } } else if (sum < target) { left++; } else { right--; } } } return result; }