日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

伍六七带你学算法 进阶篇-三数之和

發布時間:2023/11/28 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 伍六七带你学算法 进阶篇-三数之和 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
三數之和 難度-中等

題目:給你一個包含 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());}
}

以上!

總結

以上是生活随笔為你收集整理的伍六七带你学算法 进阶篇-三数之和的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。