伍六七带你学算法 进阶篇-三数之和
生活随笔
收集整理的這篇文章主要介紹了
伍六七带你学算法 进阶篇-三数之和
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
三數之和 難度-中等
題目:給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重復的三元組。
注意:答案中不可以包含重復的三元組。
示例:
給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/3sum/
public class _15三數之和 {/*** 解題思路:* 首先要理解題意:1、要求從數組中取出符合條件的三個數字* 2、不能有重復的答案->不是下標重復,是元素重復,無論順序,比如 [1,3,-4] [1,-4,3]是一樣的,屬于重復答案* 然后我們開始想如何解題* 1、這道題取出三個符合條件的數是沒有難度的,遍歷相等即可,難度在于不重復,這也是我上面標紅的原因* 2、不重復不代表需要直接去重,這樣的話 [-1,-1,2]就不會出現在你的結果集中了* 3、去重首先就是需要為數組排序,排序之后,相同的數就會相鄰,這樣我們在判斷的時候就可以進行相應的忽略即去重* 4、接下來請認真的看代碼,我為每一行都進行了解釋,有不理解歡迎留言* @param nums* @return*/public static List<List<Integer>> threeSum(int[] nums) {//調用數組排序(按從小到大排序)Arrays.sort(nums);//定義一個list,用來包裝返回值List<List<Integer>> ls = new ArrayList<>();for (int i = 0; i < nums.length - 2; i++) {if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) { // 跳過可能重復的答案//定義一個l,用來標記第二個數的下標// r是第二個數的最大值,初始為數組的最后一個元素的下標// 定義一個sum,這樣接下來計算就會省很多步int l = i + 1, r = nums.length - 1, sum = 0 - nums[i];while (l < r) {if (nums[l] + nums[r] == sum) {//如果符合情況,則添加在返回值中ls.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 (nums[l] + nums[r] < sum) {//如果 nums[l] + nums[r] + num[i] < 0 則說明當前數字相加之和還不夠大,需要將指針往后移動// 則前面的指針往后移動一位 遇到重復的跳過while (l < r && nums[l] == nums[l + 1]) l++; // 跳過重復值l++;} else {//如果 nums[l] + nums[r] + num[i] > 0 則說明當前數字相加之和過大,后面的元素已經不滿足條件,// 則后面的指針往前移動一位 遇到重復的跳過while (l < r && nums[r] == nums[r - 1]) r--;r--;}}}}return ls;}//測試public static void main(String[] args) {int num[] = {1,-5,4,4,-5,4,-1};System.out.println(threeSum(num).toString());}
}
以上!
總結
以上是生活随笔為你收集整理的伍六七带你学算法 进阶篇-三数之和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伍六七带你学算法 入门篇-最小的k个数
- 下一篇: 伍六七带你学算法 入门篇-链表的中间节点