目錄
一:題目鏈接
二:題目思路
三:代碼實現
一:題目鏈接
? ? ? ? 理解題目需要注意,如果兩個四元組元素一一對應,則認為兩個四元組重復,選擇其中一個四元組即可。比如 [ 0 , 1 , 0 ,? 2] 和 [ 1? ,? 0? ,2, 0 ] ,那么認為這兩個四元組是相同的。選擇其中一個即可。
二:題目思路
? ? ? ? 我i們的思路是 排序 + 固定數字 + 固定數字 + 雙指針 來解決。
? ? ? ? 首先,將數組排好序后,我們確定一個固定數 a 從 數組起始位置開始 ,另一個固定數 b 從 a 的下一位開始,再定義兩個指針 left 和 right ,如圖:
? ? ? ? 先看固定數 b 和這兩個指針,后續思路就是我們之前所講的 “三數之和” , (務必理解這篇文章后再看下面思路),只不過這里的判斷條件改成 nums[left] + nums[right] == target - a - b;并且過程要注意,最外層的固定數 a 也需要去重。所以大致思路也就是 “三數之和” 最外層再套了個 for 循環。
三:代碼實現
//存儲結果集List<List<Integer>> ret = new ArrayList<>();//排序數組Arrays.sort(nums);int n = nums.length;//小優化if (n < 4 || (long) nums[0] + nums[1] + nums[2] + nums[3] > target) {return ret;}for (int i = 0; i < n;) { //固定數字 afor (int j = i + 1; j < n;) { //固定數字 blong sum = (long) target - nums[i] - nums[j];int left = j + 1;int right = n - 1;while (left < right) {if ((long) nums[left] + nums[right] < sum) {left++;} else if ((long) nums[left] + nums[right] > sum) {right--;} else {//添加當前符合條件的四元組ret.add(Arrays.asList(nums[i], nums[j], nums[left],nums[right]));left++;right--;while (left < right && nums[left] == nums[left - 1]) {left++;}while (left < right && nums[right] == nums[right + 1]) {right--;}}}//去重 jj++;while (j < n && nums[j] == nums[j - 1]) {j++;}}//去重 ii++;while (i < n && nums[i] == nums[i - 1]) {i++;}}return ret;
? ? ? ? 小優化代碼解釋:如果當前數組元素不夠 四個,或者數組最小的四個數加起來都比 target 大,就可以直接返回了。