Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 6c3753f

Browse files
committedAug 1, 2024
solves Find K Closest Elements in java
1 parent f11d33d commit 6c3753f

5 files changed

+87
-40
lines changed
 

Diff for: ‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@
381381
| 645 | [Set Mismatch](https://leetcode.com/problems/set-mismatch) | [![Java](assets/java.png)](src/SetMismatch.java) [![Python](assets/python.png)](python/set_mismatch.py) | |
382382
| 653 | [Two Sum IV - Input is a BST](https://leetcode.com/problems/two-sum-iv-input-is-a-bst) | [![Java](assets/java.png)](src/TwoSumIVInputIsABST.java) [![Python](assets/python.png)](python/two_sum_iv.py) | |
383383
| 657 | [Robot Return to Origin](https://leetcode.com/problems/robot-return-to-origin) | [![Java](assets/java.png)](src/RobotReturnToOrigin.java) [![Python](assets/python.png)](python/robot_return_to_origin.py) | |
384+
| 658 | [Find K Closest Elements](https://leetcode.com/problems/find-k-closest-elements) | [![Java](assets/java.png)](src/FindKClosestElements.java) | |
384385
| 661 | [Image Smoother](https://leetcode.com/problems/image-smoother) | [![Java](assets/java.png)](src/ImageSmoother.java) [![Python](assets/python.png)](python/image_smoother.py) | |
385386
| 665 | [Non Deceasing Array](https://leetcode.com/problems/non-decreasing-array) | [![Java](assets/java.png)](src/NonDecreasingArray.java) [![Python](assets/python.png)](python/non_decreasing_array.py) | |
386387
| 669 | [Trim a Binary Search Tree](https://leetcode.com/problems/trim-a-binary-search-tree) | [![Java](assets/java.png)](src/TrimABinarySearchTree.java) [![Python](assets/python.png)](python/trim_a_binary_search_tree.py) | |

Diff for: ‎src/FindKClosestElements.java

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// https://leetcode.com/problems/find-k-closest-elements
2+
// T: O(logN + KLogK)
3+
// S: O(logK)
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class FindKClosestElements {
9+
public static List<Integer> findClosestElements(int[] array, int k, int x) {
10+
final int index = binarySearch(array, x);
11+
final List<Integer> result = new ArrayList<>();
12+
13+
for (int left = index - 1, right = index ; k > 0 ; k--) {
14+
if (left == -1) {
15+
result.add(array[right++]);
16+
} else if (right == array.length) {
17+
result.add(array[left--]);
18+
} else {
19+
if (Math.abs(array[left] - x) <= Math.abs(array[right] - x)) {
20+
result.add(array[left--]);
21+
} else {
22+
result.add(array[right++]);
23+
}
24+
}
25+
}
26+
27+
result.sort(Integer::compareTo);
28+
return result;
29+
}
30+
31+
private static int binarySearch(int[] array, int x) {
32+
int left = 0, right = array.length - 1, middle;
33+
while (left <= right) {
34+
middle = left + (right - left) / 2;
35+
if (array[middle] == x) return middle;
36+
else if (array[middle] < x) left = middle + 1;
37+
else right = middle - 1;
38+
}
39+
return left;
40+
}
41+
42+
public static void main(String[] args) {
43+
System.out.println(findClosestElements(new int[] {}, 3, 5));
44+
}
45+
}

Diff for: ‎src/FindMinimumInRotatedSortedArray.java

+10-14
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,17 @@
33
// T: O(1)
44

55
public class FindMinimumInRotatedSortedArray {
6-
public int findMin(int[] array) {
7-
if (!isRotated(array)) return array[0];
8-
9-
for (int left = 0, right = array.length - 1 ; left <= right ; ) {
10-
int middle = left + (right - left) / 2;
11-
if (array[middle] > array[middle + 1]) return array[middle + 1];
12-
if (array[middle] < array[middle - 1]) return array[middle];
13-
14-
if (array[middle] < array[array.length - 1]) right = middle - 1;
15-
else left = middle + 1;
16-
}
17-
return -1;
6+
public int findMin(int[] nums) {
7+
return nums[binarySearchPivotIndex(nums)];
188
}
199

20-
private boolean isRotated(int[] array) {
21-
return array[0] > array[array.length - 1];
10+
private static int binarySearchPivotIndex(int[] array) {
11+
int left = 0, right = array.length - 1, middle;
12+
while (left <= right) {
13+
middle = left + (right - left) / 2;
14+
if (array[middle] > array[array.length - 1]) left = middle + 1;
15+
else right = middle - 1;
16+
}
17+
return left;
2218
}
2319
}

Diff for: ‎src/FindPeakElement.java

+8-14
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,19 @@
33
// S: O(1)
44

55
public class FindPeakElement {
6-
public static int findPeakElement(int[] array) {
7-
for (int left = 0, right = array.length - 1, middle ; left <= right ; ) {
6+
public int findPeakElement(int[] nums) {
7+
int left = 0, right = nums.length - 1, middle;
8+
while (left <= right) {
89
middle = left + (right - left) / 2;
9-
10-
if (isPeakElement(array, middle)) return middle;
11-
12-
if (isOnIncreasingSlope(array, middle)) left = middle + 1;
10+
if (isPeak(nums, middle)) return middle;
11+
else if (middle + 1 < nums.length && nums[middle] < nums[middle + 1]) left = middle + 1;
1312
else right = middle - 1;
1413
}
1514
return -1;
1615
}
1716

18-
private static boolean isOnIncreasingSlope(int[] array, int index) {
19-
return ((index > 0 && array[index - 1] < array[index]) || index == 0)
20-
&& ((index + 1 < array.length && array[index] < array[index + 1]) || index == array.length - 1);
21-
}
22-
23-
private static boolean isPeakElement(int[] array, int index) {
24-
return ((index > 0 && array[index - 1] < array[index]) || index == 0)
25-
&& ((index + 1 < array.length && array[index + 1] < array[index]) || index == array.length - 1);
17+
private static boolean isPeak(int[] array, int x) {
18+
return (x - 1 < 0 || array[x - 1] < array[x])
19+
&& (x + 1 >= array.length || array[x] > array[x + 1]);
2620
}
2721
}

Diff for: ‎src/HelloWorld.java

+23-12
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,39 @@
11
public class HelloWorld {
2-
public int search(int[] nums, int target) {
3-
final int pivotIndex = binarySearchPivotIndex(nums);
4-
final int answer = binarySearch(nums, 0, pivotIndex - 1, target);
5-
if (answer != -1) {
6-
return answer;
2+
public int[] searchRange(int[] nums, int target) {
3+
if (nums.length == 0) {
4+
return new int[] {-1, -1};
75
}
8-
return binarySearch(nums, pivotIndex, nums.length - 1, target);
6+
7+
return new int[] {
8+
leftBinarySearch(nums, target),
9+
rightBinarySearch(nums, target)
10+
};
911
}
1012

11-
private static int binarySearchPivotIndex(int[] array) {
13+
private static int leftBinarySearch(int[] array, int x) {
1214
int left = 0, right = array.length - 1, middle;
1315
while (left <= right) {
1416
middle = left + (right - left) / 2;
15-
if (array[middle] > array[array.length - 1]) left = middle + 1;
17+
if (array[middle] == x) {
18+
if (middle - 1 >= 0 && array[middle - 1] == x) {
19+
right = middle - 1;
20+
} else return middle;
21+
}
22+
else if (array[middle] < x) left = middle + 1;
1623
else right = middle - 1;
1724
}
18-
return left;
25+
return -1;
1926
}
2027

21-
private static int binarySearch(int[] array, int start, int end, int x) {
22-
int left = start, right = end, middle;
28+
private static int rightBinarySearch(int[] array, int x) {
29+
int left = 0, right = array.length - 1, middle;
2330
while (left <= right) {
2431
middle = left + (right - left) / 2;
25-
if (array[middle] == x) return middle;
32+
if (array[middle] == x) {
33+
if (middle + 1 < array.length && array[middle + 1] == x) {
34+
left = middle + 1;
35+
} else return middle;
36+
}
2637
else if (array[middle] < x) left = middle + 1;
2738
else right = middle - 1;
2839
}

0 commit comments

Comments
 (0)