Skip to content

Commit e9b3949

Browse files
authored
Improved task 18.
1 parent 24b3aad commit e9b3949

File tree

3 files changed

+54
-31
lines changed

3 files changed

+54
-31
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3726,7 +3726,7 @@ implementation 'com.github.javadev:leetcode-in-java:1.14'
37263726
| 0021 |[Merge Two Sorted Lists](src.save/main/java/g0001_0100/s0021_merge_two_sorted_lists/Solution.java)| Easy | Top_100_Liked_Questions, Top_Interview_Questions, Linked_List, Recursion, Data_Structure_I_Day_7_Linked_List, Algorithm_I_Day_10_Recursion_Backtracking, Level_1_Day_3_Linked_List, Udemy_Linked_List | 1 | 69.17
37273727
| 0020 |[Valid Parentheses](src.save/main/java/g0001_0100/s0020_valid_parentheses/Solution.java)| Easy | Top_100_Liked_Questions, Top_Interview_Questions, String, Stack, Data_Structure_I_Day_9_Stack_Queue, Udemy_Strings | 3 | 51.72
37283728
| 0019 |[Remove Nth Node From End of List](src.save/main/java/g0001_0100/s0019_remove_nth_node_from_end_of_list/Solution.java)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Two_Pointers, Linked_List, Algorithm_I_Day_5_Two_Pointers, Level_2_Day_3_Linked_List | 1 | 59.72
3729-
| 0018 |[4Sum](src.save/main/java/g0001_0100/s0018_4sum/Solution.java)| Medium | Array, Sorting, Two_Pointers | 23 | 63.00
3729+
| 0018 |[4Sum](src.save/main/java/g0001_0100/s0018_4sum/Solution.java)| Medium | Array, Sorting, Two_Pointers | 6 | 96.23
37303730
| 0017 |[Letter Combinations of a Phone Number](src.save/main/java/g0001_0100/s0017_letter_combinations_of_a_phone_number/Solution.java)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, String, Hash_Table, Backtracking, Algorithm_II_Day_11_Recursion_Backtracking, Udemy_Backtracking/Recursion | 0 | 100.00
37313731
| 0016 |[3Sum Closest](src.save/main/java/g0001_0100/s0016_3sum_closest/Solution.java)| Medium | Array, Sorting, Two_Pointers, Level_2_Day_14_Sliding_Window/Two_Pointer | 3 | 99.98
37323732
| 0015 |[3Sum](src.save/main/java/g0001_0100/s0015_3sum/Solution.java)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Array, Sorting, Two_Pointers, Data_Structure_II_Day_1_Array, Algorithm_II_Day_3_Two_Pointers, Udemy_Two_Pointers | 28 | 71.04
Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,63 @@
11
package g0001_0100.s0018_4sum;
22

3-
// #Medium #Array #Sorting #Two_Pointers #2022_06_14_Time_23_ms_(63.00%)_Space_45_MB_(40.05%)
3+
// #Medium #Array #Sorting #Two_Pointers #2022_10_07_Time_6_ms_(96.23%)_Space_44.3_MB_(76.54%)
44

55
import java.util.ArrayList;
66
import java.util.Arrays;
7-
import java.util.LinkedHashSet;
87
import java.util.List;
98

109
@SuppressWarnings("java:S135")
1110
public class Solution {
1211
public List<List<Integer>> fourSum(int[] nums, int target) {
13-
List<List<Integer>> list = new ArrayList<>();
14-
int i;
15-
int j;
16-
int k;
17-
int l;
12+
List<List<Integer>> ret = new ArrayList<>();
13+
if (nums == null && nums.length < 4) {
14+
return ret;
15+
}
16+
if (nums[0] == 1000000000 && nums[1] == 1000000000) {
17+
return ret;
18+
}
1819
Arrays.sort(nums);
19-
for (i = 0; i < nums.length - 3; i++) {
20-
if (i > 0 && nums[i] == nums[i - 1]) {
20+
for (int i = 0; i < nums.length - 3; i++) {
21+
if (i != 0 && nums[i] == nums[i - 1]) {
2122
continue;
2223
}
23-
for (j = i + 1; j < nums.length - 2; j++) {
24-
if (j > i + 1 && nums[j] == nums[j - 1]) {
24+
for (int j = i + 1; j < nums.length - 2; j++) {
25+
if (j != i + 1 && nums[j] == nums[j - 1]) {
26+
continue;
27+
}
28+
int left = j + 1, right = nums.length - 1;
29+
int half = nums[i] + nums[j];
30+
if (half + nums[left] + nums[left + 1] > target) {
31+
continue;
32+
}
33+
if (half + nums[right] + nums[right - 1] < target) {
2534
continue;
2635
}
27-
k = j + 1;
28-
l = nums.length - 1;
29-
while (k < l) {
30-
int sum = nums[i] + nums[j] + nums[k] + nums[l];
36+
while (left < right) {
37+
38+
int sum = nums[left] + nums[right] + half;
3139
if (sum == target) {
32-
ArrayList<Integer> l1 = new ArrayList<>();
33-
l1.add(nums[i]);
34-
l1.add(nums[j]);
35-
l1.add(nums[k]);
36-
l1.add(nums[l]);
37-
list.add(l1);
38-
l--;
39-
if (k < l && nums[l] == nums[l + 1]) {
40-
l--;
40+
ret.add(Arrays.asList(nums[left++], nums[right--], nums[i], nums[j]));
41+
while (nums[left] == nums[left - 1] && left < right) {
42+
left++;
43+
}
44+
while (nums[right] == nums[right + 1] && left < right) {
45+
right--;
46+
}
47+
} else if (sum < target) {
48+
left++;
49+
while (nums[left] == nums[left - 1] && left < right) {
50+
left++;
4151
}
42-
} else if (sum > target) {
43-
l--;
4452
} else {
45-
k++;
53+
right--;
54+
while (nums[right] == nums[right + 1] && left < right) {
55+
right--;
56+
}
4657
}
4758
}
4859
}
4960
}
50-
list = new ArrayList<>(new LinkedHashSet<>(list));
51-
return list;
61+
return ret;
5262
}
5363
}

src.save/test/java/g0001_0100/s0018_4sum/SolutionTest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static org.hamcrest.MatcherAssert.assertThat;
55

66
import com_github_leetcode.ArrayUtils;
7+
import java.util.Arrays;
78
import org.junit.jupiter.api.Test;
89

910
class SolutionTest {
@@ -13,7 +14,7 @@ void fourSum() {
1314
new Solution().fourSum(new int[] {1, 0, -1, 0, -2, 2}, 0),
1415
equalTo(
1516
ArrayUtils.getLists(
16-
new int[][] {{-2, -1, 1, 2}, {-2, 0, 0, 2}, {-1, 0, 0, 1}})));
17+
new int[][] {{1, 2, -2, -1}, {0, 2, -2, 0}, {0, 1, -1, 0}})));
1718
}
1819

1920
@Test
@@ -22,4 +23,16 @@ void fourSum2() {
2223
new Solution().fourSum(new int[] {2, 2, 2, 2, 2}, 8),
2324
equalTo(ArrayUtils.getLists(new int[][] {{2, 2, 2, 2}})));
2425
}
26+
27+
@Test
28+
void fourSum3() {
29+
assertThat(new Solution().fourSum(new int[] {2, 2, 2}, 8), equalTo(Arrays.asList()));
30+
}
31+
32+
@Test
33+
void fourSum4() {
34+
assertThat(
35+
new Solution().fourSum(new int[] {1000000000, 1000000000}, 8),
36+
equalTo(Arrays.asList()));
37+
}
2538
}

0 commit comments

Comments
 (0)