Skip to content

Commit 710e44a

Browse files
authored
Improved task 18
1 parent e07de34 commit 710e44a

File tree

3 files changed

+40
-38
lines changed

3 files changed

+40
-38
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2247,7 +2247,7 @@ implementation 'com.github.javadev:leetcode-in-kotlin:1.9'
22472247
| 0021 |[Merge Two Sorted Lists](src.save/main/kotlin/g0001_0100/s0021_merge_two_sorted_lists/Solution.kt)| 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 | 176 | 96.25
22482248
| 0020 |[Valid Parentheses](src.save/main/kotlin/g0001_0100/s0020_valid_parentheses/Solution.kt)| Easy | Top_100_Liked_Questions, Top_Interview_Questions, String, Stack, Data_Structure_I_Day_9_Stack_Queue, Udemy_Strings | 226 | 72.53
22492249
| 0019 |[Remove Nth Node From End of List](src.save/main/kotlin/g0001_0100/s0019_remove_nth_node_from_end_of_list/Solution.kt)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, Two_Pointers, Linked_List, Algorithm_I_Day_5_Two_Pointers, Level_2_Day_3_Linked_List | 180 | 91.58
2250-
| 0018 |[4Sum](src.save/main/kotlin/g0001_0100/s0018_4sum/Solution.kt)| Medium | Array, Sorting, Two_Pointers | 244 | 100.00
2250+
| 0018 |[4Sum](src.save/main/kotlin/g0001_0100/s0018_4sum/Solution.kt)| Medium | Array, Sorting, Two_Pointers | 221 | 100.00
22512251
| 0017 |[Letter Combinations of a Phone Number](src.save/main/kotlin/g0001_0100/s0017_letter_combinations_of_a_phone_number/Solution.kt)| Medium | Top_100_Liked_Questions, Top_Interview_Questions, String, Hash_Table, Backtracking, Algorithm_II_Day_11_Recursion_Backtracking, Udemy_Backtracking/Recursion | 262 | 73.59
22522252
| 0016 |[3Sum Closest](src.save/main/kotlin/g0001_0100/s0016_3sum_closest/Solution.kt)| Medium | Array, Sorting, Two_Pointers, Level_2_Day_14_Sliding_Window/Two_Pointer | 413 | 95.05
22532253
| 0015 |[3Sum](src.save/main/kotlin/g0001_0100/s0015_3sum/Solution.kt)| 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 | 761 | 90.55
Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,60 @@
11
package g0001_0100.s0018_4sum
22

3-
// #Medium #Array #Sorting #Two_Pointers #2022_10_06_Time_244_ms_(100.00%)_Space_38.8_MB_(100.00%)
3+
// #Medium #Array #Sorting #Two_Pointers #2023_02_27_Time_221_ms_(100.00%)_Space_36.8_MB_(100.00%)
44

55
class Solution {
66
fun fourSum(nums: IntArray, target: Int): List<List<Int>> {
7-
val ret: MutableList<List<Int>> = ArrayList()
8-
if (nums.size < 4) {
9-
return ret
10-
}
11-
if (nums[0] == 1000000000 && nums[1] == 1000000000) {
12-
return ret
13-
}
7+
val n = nums.size
148
nums.sort()
15-
for (i in 0 until nums.size - 3) {
16-
if (i != 0 && nums[i] == nums[i - 1]) {
9+
val result: MutableList<List<Int>> = ArrayList()
10+
for (i in 0 until n - 3) {
11+
if (i > 0 && nums[i] == nums[i - 1]) {
12+
continue
13+
}
14+
if (nums[i].toLong() + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
15+
break
16+
}
17+
if (nums[i].toLong() + nums[n - 3] + nums[n - 2] + nums[n - 1] < target) {
1718
continue
1819
}
19-
for (j in i + 1 until nums.size - 2) {
20-
if (j != i + 1 && nums[j] == nums[j - 1]) {
20+
for (j in i + 1 until n - 2) {
21+
if (j > i + 1 && nums[j] == nums[j - 1]) {
2122
continue
2223
}
23-
var left = j + 1
24-
var right = nums.size - 1
25-
val half = nums[i] + nums[j]
26-
if (half + nums[left] + nums[left + 1] > target) {
27-
continue
24+
if (nums[j].toLong() + nums[j + 1] + nums[j + 2] > target - nums[i]) {
25+
break
2826
}
29-
if (half + nums[right] + nums[right - 1] < target) {
27+
if (nums[j].toLong() + nums[n - 2] + nums[n - 1] < target - nums[i]) {
3028
continue
3129
}
32-
while (left < right) {
33-
val sum = nums[left] + nums[right] + half
34-
if (sum == target) {
35-
ret.add(listOf(nums[left++], nums[right--], nums[i], nums[j]))
36-
while (nums[left] == nums[left - 1] && left < right) {
37-
left++
30+
val tempTarget = target - (nums[i] + nums[j])
31+
var low = j + 1
32+
var high = n - 1
33+
while (low < high) {
34+
val curSum = nums[low] + nums[high]
35+
if (curSum == tempTarget) {
36+
val tempList: MutableList<Int> = ArrayList()
37+
tempList.add(nums[i])
38+
tempList.add(nums[j])
39+
tempList.add(nums[low])
40+
tempList.add(nums[high])
41+
result.add(tempList)
42+
low++
43+
high--
44+
while (low < high && nums[low] == nums[low - 1]) {
45+
low++
3846
}
39-
while (nums[right] == nums[right + 1] && left < right) {
40-
right--
41-
}
42-
} else if (sum < target) {
43-
left++
44-
while (nums[left] == nums[left - 1] && left < right) {
45-
left++
47+
while (low < high && nums[high] == nums[high + 1]) {
48+
high--
4649
}
50+
} else if (curSum < tempTarget) {
51+
low++
4752
} else {
48-
right--
49-
while (nums[right] == nums[right + 1] && left < right) {
50-
right--
51-
}
53+
high--
5254
}
5355
}
5456
}
5557
}
56-
return ret
58+
return result
5759
}
5860
}

src.save/test/kotlin/g0001_0100/s0018_4sum/SolutionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ internal class SolutionTest {
1111
assertThat(
1212
Solution().fourSum(intArrayOf(1, 0, -1, 0, -2, 2), 0),
1313
equalTo(
14-
getLists(arrayOf(intArrayOf(1, 2, -2, -1), intArrayOf(0, 2, -2, 0), intArrayOf(0, 1, -1, 0)))
14+
getLists(arrayOf(intArrayOf(-2, -1, 1, 2), intArrayOf(-2, 0, 0, 2), intArrayOf(-1, 0, 0, 1)))
1515
)
1616
)
1717
}

0 commit comments

Comments
 (0)