Skip to content

Commit 09c89cb

Browse files
add problem 34 and test function
1 parent a1e4ebc commit 09c89cb

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

C/1-50/34-Search-for-a-Range.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Given an array of integers sorted in ascending order, find the starting and ending position of a given target value.
3+
4+
* Your algorithm's runtime complexity must be in the order of O(log n).
5+
6+
* If the target is not found in the array, return [-1, -1].
7+
8+
* For example,
9+
* Given [5, 7, 7, 8, 8, 10] and target value 8,
10+
* return [3, 4].
11+
* Created by supercoderx on 2017/8/12.
12+
*/
13+
#include
14+
#include
15+
16+
int *searchRange(int *nums, int numsSize, int target, int *returnSize) {
17+
*returnSize = 2;
18+
int *result = malloc(sizeof(int) * 2);
19+
result[0] = -1;
20+
result[1] = -1;
21+
if (numsSize == 0) {
22+
return result;
23+
}
24+
25+
int left = 0, right = numsSize - 1, mid, start, end;
26+
while (left <= right) {
27+
mid = (left + right) / 2;
28+
if (nums[mid] == target) {
29+
start = end = mid;
30+
while (start >= 0) {
31+
if (nums[start] != nums[mid]) {
32+
start++;
33+
break;
34+
}
35+
if (start == 0) {
36+
break;
37+
}
38+
start--;
39+
}
40+
while (end <= numsSize - 1) {
41+
if (nums[end] != nums[mid]) {
42+
end--;
43+
break;
44+
}
45+
if (end == numsSize - 1) {
46+
break;
47+
}
48+
end++;
49+
}
50+
result[0] = start;
51+
result[1] = end;
52+
return result;
53+
} else if (nums[mid] < target) {
54+
left = mid + 1;
55+
} else {
56+
right = mid - 1;
57+
}
58+
}
59+
return result;
60+
}
61+
62+
void testSearchRange() {
63+
int a[] = {5, 7, 7, 7, 7, 8, 8, 10}, b[] = {1}, count = 0;
64+
int *res = searchRange(b, 1, 1, &count);
65+
66+
printf("[%d,%d]", res[0], res[1]);
67+
68+
}

0 commit comments

Comments
 (0)