leetcode-15-三数之和
生活随笔
收集整理的這篇文章主要介紹了
leetcode-15-三数之和
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題:
?解:
class Solution {/*** 給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?* 找出所有滿足條件且不重復的三元組。* 雙指針法,* 首先,將數組nums排序,循環整個數組* 在num[i]后定義左右兩個指正,left=i+1,right=len-1* 1)如果nums[i] 大于零的話,那么三個數相加一定大于0,終止循環,* 2)如果nums[i] == nums[i - 1],則代表該值已經判斷過,跳過該值* 3)當三個數和等于0時,如果nums[left] == nums[left + 1],會導致數據重復,跳過該值,記錄右側的值為結果* 4)當三個數和等于0時,如果nums[right] == nums[right - 1],會導致數據重復,跳過該值,記錄左側的值為結果** @param nums* @return*/public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();if (nums == null || nums.length < 3) {return res;}//先將數組排序quickSort(nums, 0, nums.length - 1);// 雙指針法for (int i = 0; i < nums.length && nums[i] <= 0; i++) {int left = i + 1;int right = nums.length - 1;if (i > 0 && nums[i] == nums[i - 1]) {continue;}while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum == 0) {List<Integer> list = new ArrayList<>();list.add(nums[i]);list.add(nums[left]);list.add(nums[right]);res.add(list);while (left < right && nums[left] == nums[left + 1]) {left++;}while (left < right && nums[right] == nums[right - 1]) {right--;}left++;right--;} else if (sum < 0) {left++;} else {right--;}}}return res;}/*** 快排nums數組** @param arr* @param left* @param right* @return*/public void quickSort(int[] arr, int left, int right) {//遞歸終止條件if (left > right) {return;}int base = arr[left];int l = left;int r = right;while (l != r) {while (l < r && arr[r] >= base) {r--;}while (l < r && arr[l] <= base) {l++;}if (l < r) {swap(arr, r, l);}}swap(arr, left, l);quickSort(arr, left, l - 1);quickSort(arr, l + 1, right);}/*** 交換兩個數** @param arr* @param r* @param l*/private void swap(int[] arr, int r, int l) {int temp = arr[r];arr[r] = arr[l];arr[l] = temp;} }?
總結
以上是生活随笔為你收集整理的leetcode-15-三数之和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode-13-罗马数字转整数
- 下一篇: 基础-递归