From cee8800a969423680f17bf17784545f03bb06ea7 Mon Sep 17 00:00:00 2001 From: begeekmyfriend Date: Tue, 25 Jul 2017 10:09:22 +0800 Subject: [PATCH] Search for a range Signed-off-by: begeekmyfriend --- 034_search_for_a_range/Makefile | 2 + 034_search_for_a_range/range_search.c | 74 +++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 034_search_for_a_range/Makefile create mode 100644 034_search_for_a_range/range_search.c diff --git a/034_search_for_a_range/Makefile b/034_search_for_a_range/Makefile new file mode 100644 index 0000000..8660352 --- /dev/null +++ b/034_search_for_a_range/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test range_search.c diff --git a/034_search_for_a_range/range_search.c b/034_search_for_a_range/range_search.c new file mode 100644 index 0000000..115c0e1 --- /dev/null +++ b/034_search_for_a_range/range_search.c @@ -0,0 +1,74 @@ +#include +#include + +static int binary_search_start(int *a, int size, int target) +{ + int low = -1; + int high = size; + while (low + 1 < high) { + int mid = low + (high - low) / 2; + if (target > a[mid]) { + low = mid; + } else { + high = mid; + } + } + + if (high == size || a[high] != target) { + return -1; + } else { + return high; + } +} + +static int binary_search_end(int *a, int size, int target) +{ + int low = -1; + int high = size; + while (low + 1 < high) { + int mid = low + (high - low) / 2; + if (target < a[mid]) { + high = mid; + } else { + low = mid; + } + } + + if (low == -1 || a[low] != target) { + return -1; + } else { + return low; + } +} + +/** + ** Return an array of size *returnSize. + ** Note: The returned array must be malloced, assume caller calls free(). + **/ +int* searchRange(int* nums, int numsSize, int target, int* returnSize) { + int *range = malloc(2 * sizeof(int)); + + if (numsSize == 0) { + range[0] = range[1] = -1; + return range; + } + + range[0] = binary_search_start(nums, numsSize, target); + range[1] = binary_search_end(nums, numsSize, target); + *returnSize = 2; + return range; +} + +int main(int argc, char **argv) +{ + int i, count; + int *nums = malloc((argc - 2) * sizeof(int)); + for (i = 0; i < argc - 2; i++) { + nums[i] = atoi(argv[i + 2]); + } + + int *range = searchRange(nums, argc - 2, atoi(argv[1]), &count); + printf("%d %d\n", range[0], range[1]); + + return 0; +}