diff --git a/081_search_in_rotated_sorted_array_ii/Makefile b/081_search_in_rotated_sorted_array_ii/Makefile new file mode 100644 index 0000000..751e614 --- /dev/null +++ b/081_search_in_rotated_sorted_array_ii/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test search_rotated_array.c diff --git a/081_search_in_rotated_sorted_array_ii/search_rotated_array.c b/081_search_in_rotated_sorted_array_ii/search_rotated_array.c new file mode 100644 index 0000000..b5ba3b5 --- /dev/null +++ b/081_search_in_rotated_sorted_array_ii/search_rotated_array.c @@ -0,0 +1,62 @@ +#include +#include + +static int binary_search(int *nums, int size, int target) +{ + int low = -1; + int high = size; + while (low + 1 < high) { + int mid = low + (high - low) / 2; + if (target > nums[mid]) { + low = mid; + } else { + high = mid; + } + } + if (high == size || nums[high] != target) { + return -1; + } else { + return high; + } +} + +static int search(int* nums, int numsSize, int target) { + if (numsSize <= 0) { + return -1; + } + if (numsSize == 1) { + return target == nums[0] ? 0 : -1; + } + + int i; + for (i = 1; i < numsSize; i++) { + if (nums[i] < nums[i - 1]) { + break; + } + } + + if (i == 0) { + return binary_search(nums, numsSize, target); + } else if (target >= nums[0]) { + return binary_search(nums, i, target); + } else if (target <= nums[numsSize - 1]) { + int index = binary_search(nums + i, numsSize - i, target); + return index >= 0 ? index + i : -1; + } else { + return -1; + } +} + +int main(int argc, char **argv) +{ + int i; + int target = atoi(argv[1]); + int size = argc - 2; + int *nums = malloc(size * sizeof(int)); + + for (i = 0; i < argc - 2; i++) { + nums[i] = atoi(argv[i + 2]); + } + printf("%d\n", search(nums, size, target)); + return 0; +}