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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LeetCode笔记】15.三数之和(JAVA、双指针)

發布時間:2024/7/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】15.三数之和(JAVA、双指针) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 代碼 & 解題思路
      • 二刷更新

題目描述

  • 主要是解決重復的問題:如何去除重復解、在有大量重復解的情況下如何讓算法跑得更快

代碼 & 解題思路

  • 排序,按照大小順序來做。
  • 思路:固定第一個數,用雙指針分別代表另外兩個指針
  • 去除重復值:對三個數,分別進行去除重復解的行為(見代碼注釋):
  • 第一個數:如果num[i] == num[i-1],那么num[i-1]肯定已經把num[i]的任務給完成了,那么繼續進行對num[i]作為第一個數的求解并沒有意義,而且可能會帶來重復解,因此跳過
  • 第二個數:比如說left將要渡過“222”,那么用第一個2作為解時,剩下的兩個2就已經沒有意義了,于是可以直接跳過后兩個2。
  • 第三個數:和第二個數的原理一樣。
  • 注意:要先取得解,再進行跳過重復,直接跳重復,再取值會出問題,或需要更多判斷。
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ans = new ArrayList<List<Integer>>();int len = nums.length;if (len < 3) {return ans;}Arrays.sort(nums);if (nums[0] > 0 || nums[len - 1] < 0) {return ans;}int groupIndex = 0;for (int i = 0; i < len - 2; i++) {// 去除第一位重復解if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1, right = len - 1;// 雙指針法尋找符合條件的情況while(left < right){int temp = nums[i] + nums[left] + nums[right];if (temp == 0) {ans.add(new ArrayList<Integer>());ans.get(groupIndex).add(nums[i]);ans.get(groupIndex).add(nums[left]);ans.get(groupIndex).add(nums[right]);groupIndex++;// 找到解后,去除重復解while(left < right && nums[left+1] == nums[left]) ++left;while (right < right && nums[right-1] == nums[right]) --right;left++; right--;}// 大了,right往小點走else if (temp > 0) {right--;}// 小了,left往大點走else {left++;}}}return ans;} }
  • 時間復雜度:排序O(nlogn) + 遍歷固定第一解O(n) * 雙指針遍歷 O(n),算是O(n2n^2n2)
  • 空間復雜度:O(1)

二刷更新

  • 之前的代碼看看注釋就好,寫的有點冗余了,不到20行就能解決的事
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ans = new ArrayList<>();Arrays.sort(nums);for(int i = 0; i < nums.length - 2; i++) {if(i > 0 && nums[i] == nums[i - 1]) continue;int left = i + 1, right = nums.length - 1;while(left < right) {int temp = nums[i] + nums[left] + nums[right];if(temp == 0) {List<Integer> element = new ArrayList<>();element.add(nums[i]);element.add(nums[left]);element.add(nums[right]);ans.add(element);while(left < right && nums[left + 1] == nums[left]) left++;while(left < right && nums[right - 1] == nums[right]) right--;left++; right--;} else if(temp > 0) right--;else left++;}}return ans;} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】15.三数之和(JAVA、双指针)的全部內容,希望文章能夠幫你解決所遇到的問題。

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