Skip to content

Commit 97a40bd

Browse files
committed
五刷15
1 parent f33ab85 commit 97a40bd

File tree

5 files changed

+94
-2
lines changed

5 files changed

+94
-2
lines changed

docs/0015-3sum.adoc

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[#0015-3sum]
22
= 15. 三数之和
33

4-
https://leetcode.cn/problems/3sum/[LeetCode - 15. 三数之和 ^]
4+
https://leetcode.cn/problems/3sum/[LeetCode - 15. 三数之和^]
55

66
给你一个整数数组 `nums` ,判断是否存在三元组 `[nums[i], nums[j], nums[k]]` 满足 `i != j``i != k``j != k` ,同时还满足 `nums[i] + nums[j] + nums[k] == 0`。请你返回所有和为 `0` 且不重复的三元组。
77

@@ -92,6 +92,15 @@ include::{sourcedir}/_0015_3Sum_3.java[tag=answer]
9292
include::{sourcedir}/_0015_3Sum_4.java[tag=answer]
9393
----
9494
--
95+
96+
五刷::
97+
+
98+
--
99+
[{java_src_attr}]
100+
----
101+
include::{sourcedir}/_0015_3Sum_5.java[tag=answer]
102+
----
103+
--
95104
====
96105

97106
== 参考资料

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,6 +1499,11 @@ endif::[]
14991499
|{doc_base_url}/0056-merge-intervals.adoc[题解]
15001500
|✅ 复习 {doc_base_url}/0000-04-merge-intervals.adoc[Merge Intervals 区间合并]。对区间进行排序,然后快慢指针在当前数组上对其进行合并。
15011501

1502+
|{counter:codes2503}
1503+
|{leetcode_base_url}/3sum/[15. 三数之和^]
1504+
|{doc_base_url}/0015-3sum.adoc[题解]
1505+
|✅ 复习 {doc_base_url}/0000-06-two-pointer.adoc[Two Pointer 双指针]。双指针+递归降维。
1506+
15021507
|===
15031508

15041509
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
public class _0015_3Sum_5 {
8+
// tag::answer[]
9+
10+
/**
11+
* @author D瓜哥 · https://www.diguage.com
12+
* @since 2018-07-15 00:58
13+
*/
14+
public List<List<Integer>> threeSum(int[] nums) {
15+
Arrays.sort(nums);
16+
return numSum(nums, 0, 3, 0);
17+
}
18+
19+
private List<List<Integer>> numSum(int[] nums, int index, int count, int target) {
20+
if (index + count > nums.length || count < 2) {
21+
return new ArrayList<>();
22+
}
23+
if (count == 2) {
24+
int left = index, right = nums.length - 1;
25+
List<List<Integer>> result = new ArrayList<>();
26+
while (left < right) {
27+
int ln = nums[left], rn = nums[right];
28+
if (target < ln) {
29+
break;
30+
}
31+
int sum = ln + rn;
32+
if (sum == target) {
33+
result.add(new ArrayList<>(List.of(ln, rn)));
34+
while (left < right && nums[left] == ln) {
35+
left++;
36+
}
37+
while (left < right && nums[right] == rn) {
38+
right--;
39+
}
40+
} else if (target < sum) {
41+
while (left < right && nums[right] == rn) {
42+
right--;
43+
}
44+
} else {
45+
while (left < right && nums[left] == ln) {
46+
left++;
47+
}
48+
}
49+
}
50+
return result;
51+
} else {
52+
List<List<Integer>> result = new ArrayList<>();
53+
while (index + count <= nums.length) {
54+
int sn = nums[index];
55+
List<List<Integer>> temp = numSum(nums, index + 1, count - 1, target - sn);
56+
for (List<Integer> l : temp) {
57+
l.add(sn);
58+
result.add(l);
59+
}
60+
while (index + count <= nums.length && nums[index] == sn) {
61+
index++;
62+
}
63+
}
64+
return result;
65+
}
66+
}
67+
68+
// end::answer[]
69+
public static void main(String[] args) {
70+
new _0015_3Sum_5().threeSum(new int[]{0, 0, 0});
71+
}
72+
}

src/main/java/com/diguage/algo/leetcode/_0017_LetterCombinationsOfAPhoneNumber.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@
4040
*/
4141
public class _0017_LetterCombinationsOfAPhoneNumber {
4242
// tag::answer[]
43-
43+
/**
44+
* @author D瓜哥 · https://www.diguage.com
45+
* @since 2019-07-19 00:19
46+
*/
4447
private List<String> result = new ArrayList<>();
4548
public List<String> letterCombinations(String digits) {
4649
if (Objects.isNull(digits) || digits.length() == 0) {

src/main/java/com/diguage/algo/leetcode/_0018_4Sum.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public class _0018_4Sum {
3737
* Runtime: 4 ms, faster than 94.46% of Java online submissions for 4Sum.
3838
*
3939
* Memory Usage: 40.7 MB, less than 52.17% of Java online submissions for 4Sum.
40+
*
41+
* @author D瓜哥 · https://www.diguage.com
42+
* @since 2018-07-15 00:58
4043
*/
4144
public List<List<Integer>> fourSum(int[] nums, int target) {
4245
int numCount = 4;

0 commit comments

Comments
 (0)