Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6c3753f

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

File tree

5 files changed

+87
-40
lines changed

5 files changed

+87
-40
lines changed

‎README.md

Lines changed: 1 addition & 0 deletions
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) | |

‎src/FindKClosestElements.java

Lines changed: 45 additions & 0 deletions
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+
}

‎src/FindMinimumInRotatedSortedArray.java

Lines changed: 10 additions & 14 deletions
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
}

‎src/FindPeakElement.java

Lines changed: 8 additions & 14 deletions
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
}

‎src/HelloWorld.java

Lines changed: 23 additions & 12 deletions
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, intx) {
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, intstart, intend, 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)

AltStyle によって変換されたページ (->オリジナル) /