一、題目
給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重復的三元組。
注意:答案中不可以包含重復的三元組。
示例:
給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
二、解題思路
1、新建集合
2、應當判定的只要數組的長度小於三就直接返回空集合
3、然后對數組進行排序(不進行排序是無序數組,遍歷查找工作相當復雜,而且效率極低)
4、遍歷排好序的數組,外層for循環,內層雙指針移動的方法,將外層循環的數和雙指針指向的數相加,只要相同,就存入存值集合,之后指針分別向中間移動,要判斷如果指針指向的前一個數和后一個數相同那么繼續移動指針
5、注意:外層只要遍歷到了某個數大於0,那么就直接返回此時的存值集合(因為是排好序的集合,只要大於0了,后面怎么遍歷都不會等於0)
三、代碼:
public static void main(String[] args) { int[] arrays = new int[] {-2,0,1,1,2}; System.out.println(getArraysSort(arrays)); } public static List<List<Integer>> getArraysSort(int[] arrays) { List<List<Integer>> returnList = new ArrayList<List<Integer>>(); // 獲取數組長度 int length = arrays.length; if(length < 3) { return returnList; } // 數組排序 Arrays.sort(arrays); // 采用指針進行遍歷,找值 for(int i = 0;i < length;i++) { // 判斷剩余的數是否都為正數 if(arrays[i] > 0) { return returnList; } // 判斷數字是否重復 if(i > 0 && arrays[i] == arrays[i - 1]) { continue; } int left = i + 1; int right = length - 1; while(left < right) { int temp = arrays[i] + arrays[left] + arrays[right]; if(temp == 0) { List<Integer> list = new ArrayList<Integer>(); list.add(arrays[i]); list.add(arrays[left]); list.add(arrays[right]); returnList.add(list); left++; right--; while(left < right && arrays[left] == arrays[left - 1]){ left++; } while(left < right && arrays[right] == arrays[right + 1]){ right--; } continue; }else if(temp < 0) { left++; continue; }else { right--; continue; } } } return returnList; }