生活随笔
收集整理的這篇文章主要介紹了
【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
--;}else if (temp
> 0) {right
--;}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、双指针)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。