這是我參與8月更文挑戰的第 11 天,活動詳情查看:8月更文挑戰java
給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出全部和爲 0 且不重複的三元組。python
注意:答案中不能夠包含重複的三元組。數組
示例 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
經過次數598,128提交次數1,810,450
複製代碼
有一位同窗私信我說:「肥肥爲何我總是作題喜歡暴力枚舉呢?看到一個題就只會想到枚舉」我以爲仍是作的題少了解的思路少,並且可能咱們作完一題後他沒有真正的本身作一遍知識眼睛上說回了。這把的話咱們使用暴力枚舉顯然不太可能他裏面要去重,枚舉的話會有不少重複例如markdown
[0, 1, 2, 2, 2, 3]
^ ^ ^
複製代碼
由於有三個2
結果就可能有三個[0,1,2]
這道題按個人思路: 先排序而後 app
像這樣找到一個相似於0
的位置由於想要和爲0
,確定要有正數還有負數而後兩邊的L
和R
移動尋找,像不像以前講的中心擴散法
。可是要注意下面幾個條件函數
若是 nums[i] nums[i] == nums[i-1]nums[i−1],則說明該數字重複,會致使結果重複,因此應該跳過
當 sumsum == 00 時,nums[L]nums[L] == nums[L+1]nums[L+1] 則會致使結果重複,應該跳過,L++L++
當 sumsum == 00 時,nums[R]nums[R] == nums[R-1]nums[R−1] 則會致使結果重複,應該跳過,R--R−−
複製代碼
Java中Array.sort()的幾種用法post
1、Arrays.sort(int[] a)
這種形式是對一個數組的全部元素進行排序,而且是按從小到大的順序。
複製代碼
Arrays.sort(int[] a, int fromIndex, int toIndex)
這種形式是對數組部分排序,也就是對數組a的下標從fromIndex到toIndex-1的元素排序,注意:下標爲toIndex的元素不參與排序哦!
複製代碼
public static <T> void sort(T[] a,int fromIndex,int toIndex, Comparator<? super T> c) 上面有一個拘束,就是排列順序只能是從小到大,若是咱們要從大到小,就要使用這種方式 複製代碼
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList();
int len = nums.length;
if(nums == null || len < 3) return ans;
Arrays.sort(nums); // 排序
for (int i = 0; i < len ; i++) {
if(nums[i] > 0) break; // 若是當前數字大於0,則三數之和必定大於0,因此結束循環
if(i > 0 && nums[i] == nums[i-1]) continue; // 去重
int L = i+1;
int R = len-1;
while(L < R){
int sum = nums[i] + nums[L] + nums[R];
if(sum == 0){
ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
while (L<R && nums[L] == nums[L+1]) L++; // 去重
while (L<R && nums[R] == nums[R-1]) R--; // 去重
L++;
R--;
}
else if (sum < 0) L++;
else if (sum > 0) R--;
}
}
return ans;
}
複製代碼
好了今天就到這裏就結束了,咱們明天再見ui