Skip to content

Commit d4f6d7e

Browse files
Improvement
Signed-off-by: begeekmyfriend <begeekmyfriend@gmail.com>
1 parent aca3d04 commit d4f6d7e

File tree

3 files changed

+36
-26
lines changed

3 files changed

+36
-26
lines changed

0033_search_in_rotated_sorted_array/rotated_array.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ static int search(int* nums, int numsSize, int target)
1212
return mid;
1313
}
1414

15+
/* lo might be mid */
16+
/* We only need to consider non-rotated sorted array search */
1517
if (nums[lo] <= nums[mid]) {
1618
if (nums[lo] <= target && target < nums[mid]) {
1719
hi = mid - 1;

0033_search_in_rotated_sorted_array/rotated_array.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@ class Solution {
77
int search(vector<int>& nums, int target) {
88
int lo = 0;
99
int hi = nums.size() - 1;
10+
1011
for (lo <= hi) {
1112
int mid = lo + (hi - lo) / 2;
1213
if (nums[mid] == target) {
1314
return mid;
1415
}
16+
17+
// lo might be mid
18+
// We only need to consider non-rotated sorted array search
1519
if (nums[lo] <= nums[mid]) {
1620
if (nums[lo] <= target && target < nums[mid]) {
1721
hi = mid - 1;
@@ -26,6 +30,7 @@ class Solution {
2630
}
2731
}
2832
}
33+
2934
return -1;
3035
}
3136
};

0215_kth_largest_element_in_an_array/kth_elem.c

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,47 @@
11
#include <stdio.h>
22
#include <stdlib.h>
33

4+
static inline void swap(int *a, int *b)
5+
{
6+
int t = *a;
7+
*a = *b;
8+
*b = t;
9+
}
410

5-
static int partition(int *nums, int lo, int hi)
11+
static int quick_select(int *nums, int lo, int hi, int k)
612
{
713
if (lo >= hi) {
814
return hi;
915
}
1016

11-
int i = lo;
12-
int j = hi;
13-
int pivot = nums[hi];
17+
int i = lo - 1;
18+
int j = hi + 1;
19+
int pivot = nums[lo];
1420
while (i < j) {
15-
while (i < j && nums[i] <= pivot) { i++; }
16-
/* Loop invariant: nums[i] > pivot or i == j */
17-
nums[j] = nums[i];
18-
while (i < j && nums[j] >= pivot) { j--; }
19-
/* Loop invariant: nums[j] > pivot or i == j */
20-
nums[i] = nums[j];
21+
/* For case of large amounts of consecutive duplicate elements, we
22+
* shall make the partition in the middle of the array as far as
23+
* possible. If the partition is located in the head or tail, the
24+
* performance might well be very bad for it.
25+
*/
26+
while (nums[++i] > pivot) {}
27+
while (nums[--j] < pivot) {}
28+
if (i < j) {
29+
swap(&nums[i], &nums[j]);
30+
}
31+
}
32+
33+
/* invariant: i == j + 1 or i == j */
34+
if (j >= k - 1) {
35+
return quick_select(nums, lo, j, k);
36+
} else {
37+
return quick_select(nums, j + 1, hi, k);
2138
}
22-
/* Loop invariant: i == j */
23-
nums[i] = pivot;
24-
return i;
2539
}
2640

2741
int findKthLargest(int* nums, int numsSize, int k)
2842
{
29-
int lo = 0, hi = numsSize - 1;
30-
for (; ;) {
31-
int p = partition(nums, lo, hi);
32-
if (p < numsSize - k) {
33-
lo = p + 1;
34-
} else if (p > numsSize - k) {
35-
hi = p - 1;
36-
} else {
37-
lo = p;
38-
break;
39-
}
40-
}
41-
return nums[lo];
43+
int i = quick_select(nums, 0, numsSize - 1, k);
44+
return nums[i];
4245
}
4346

4447

0 commit comments

Comments
 (0)