Skip to content

Commit 500bb6b

Browse files
committed
[Function add]
17. Letter Combinations of a Phone Number 18. 4Sum 19. Remove Nth Node From End of List
1 parent 25f2028 commit 500bb6b

12 files changed

+139
-1
lines changed

Algorithm(4th_Edition)/leetcode/1.Two Sum.md renamed to leetcode/1.Two Sum.md

File renamed without changes.

Algorithm(4th_Edition)/leetcode/12. Integer to Roman.md renamed to leetcode/12. Integer to Roman.md

File renamed without changes.

Algorithm(4th_Edition)/leetcode/13. Roman to Integer.md renamed to leetcode/13. Roman to Integer.md

File renamed without changes.

Algorithm(4th_Edition)/leetcode/14.LongestCommonPrefix.md renamed to leetcode/14.LongestCommonPrefix.md

File renamed without changes.

Algorithm(4th_Edition)/leetcode/15. 3Sum.md renamed to leetcode/15. 3Sum.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 1.Two Sum
1+
## 15. 3Sum
22
### Thinking:
33
* Method1: Two pointer
44
iterate the array in order, use left and right pointers to represent the index of the other two numbers.

leetcode/16. 3Sum Closest.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
## 3Sum Closest
2+
### Thinking:
3+
* Method1: Similar to 3Sum Runtime: 30 ms
4+
```Java
5+
class Solution {
6+
public int threeSumClosest(int[] nums, int target) {
7+
int len = nums.length;
8+
int d = Integer.MAX_VALUE;
9+
Arrays.sort(nums);
10+
for(int i = 0; i < len-2; i++){
11+
if(i > 0 && nums[i-1] == nums[i]) continue;
12+
int left = i+1; int right=len-1;
13+
int tempTarget = target - nums[i];
14+
while(left < right){
15+
if(nums[left] + nums[right] == tempTarget) return target;
16+
else if(nums[left] + nums[right] < tempTarget){
17+
if(Math.abs(target - nums[i] - nums[left] - nums[right]) < Math.abs(d))
18+
d = target-nums[i] - nums[left] - nums[right];
19+
left++;
20+
}
21+
else{
22+
if(Math.abs(target - nums[i] - nums[left] - nums[right]) < Math.abs(d))
23+
d = target-nums[i] - nums[left] - nums[right];
24+
right--;
25+
}
26+
}
27+
}
28+
return target - d;
29+
}
30+
}
31+
```
32+
33+
# Optimization Runtime: 22 ms
34+
```Java
35+
class Solution {
36+
public int threeSumClosest(int[] nums, int target) {
37+
int len = nums.length;
38+
int d = Integer.MAX_VALUE;
39+
Arrays.sort(nums);
40+
for(int i = 0; i < len-2; i++){
41+
if(i > 0 && nums[i-1] == nums[i]) continue;
42+
int left = i+1; int right=len-1;
43+
while(left < right){
44+
int t = target - nums[i] - nums[left] - nums[right];
45+
if(t == 0) return target;
46+
else if(t > 0){
47+
if(Math.abs(t) < Math.abs(d))
48+
d = t;
49+
left++;
50+
}
51+
else{
52+
if(Math.abs(t) < Math.abs(d))
53+
d = t;
54+
right--;
55+
}
56+
}
57+
}
58+
return target - d;
59+
}
60+
}
61+
```

leetcode/18. 4Sum.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
## 18. 4Sum
2+
### Thinking:
3+
* Method:
4+
It is very similar to 3sum, but we use one more index to iterate.
5+
It is very important to remove duplicate elements.
6+
```Java
7+
class Solution {
8+
public List<List<Integer>> fourSum(int[] nums, int target) {
9+
List<List<Integer>> result = new ArrayList<List<Integer>>();
10+
if(nums == null || nums.length < 4) return result;
11+
Arrays.sort(nums);
12+
int len = nums.length;
13+
for(int i = 0; i < len - 3; i++){
14+
for(int j = i+1; j < len - 2; j++){
15+
int left = j + 1; int right = len - 1;
16+
while(left < right){
17+
int temp = nums[i] + nums[j] + nums[left] + nums[right];
18+
if(temp == target){
19+
result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
20+
left++;right--;
21+
while(left < right && nums[left-1] == nums[left]) left++;
22+
while(left < right && nums[right+1] == nums[right]) right--;
23+
}else if(temp < target){
24+
left++;
25+
}else{
26+
right--;
27+
}
28+
}
29+
while(j < len - 2 && nums[j + 1] == nums[j]) j++;//Remove duplicate.
30+
}
31+
while(i < len-3 && nums[i + 1] == nums[i]) i++;//Remove duplicate.
32+
}
33+
return result;
34+
}
35+
}
36+
```
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## 19. Remove Nth Node From End of List
2+
### Thinking:
3+
* Method:
4+
1. Iterate to get the length of the list.
5+
2. Iterate again to remove
6+
3. Trick: Use a dummy node to represent the head.
7+
```Java
8+
/**
9+
* Definition for singly-linked list.
10+
* public class ListNode {
11+
* int val;
12+
* ListNode next;
13+
* ListNode(int x) { val = x; }
14+
* }
15+
*/
16+
class Solution {
17+
public ListNode removeNthFromEnd(ListNode head, int n) {
18+
ListNode result = new ListNode(0);
19+
result.next = head;
20+
int len = 0;
21+
ListNode temp = result;
22+
while(temp.next != null){
23+
temp = temp.next;
24+
len ++;
25+
}
26+
if (len < n) return null;
27+
int index = len + 1 - n;
28+
len = 0;
29+
temp = result;
30+
while(temp.next != null){
31+
len ++;
32+
if(len == index){
33+
temp.next = temp.next.next;//Remove
34+
return result.next;
35+
}
36+
temp = temp.next;
37+
}
38+
return result.next;
39+
}
40+
}
41+
```

Algorithm(4th_Edition)/leetcode/21. Merge Two Sorted Lists.md renamed to leetcode/21. Merge Two Sorted Lists.md

File renamed without changes.

Algorithm(4th_Edition)/leetcode/4. Median of Two Sorted Arrays.md renamed to leetcode/4. Median of Two Sorted Arrays.md

File renamed without changes.

0 commit comments

Comments
 (0)