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 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, intk)
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)

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