/** 二分查找 */ int binarySearch(int nums[] ,int target,int count); int main(int argc, const char * argv[]) { @autoreleasepool { int count = 7; int a[7] = {1, 2, 3, 5, 7, 9, 10}; int index = binarySearch(a, 9, count); printf("index = %d ",index); } return 0; } /** 二分查找,前提对已排序数组,时间复杂度logN(n、n/2、n/4、n/8...) */ int binarySearch(int nums[] ,int target,int count) { if (nums == NULL || count == 0) {return -1;} int start = 0,end = count - 1; while (start + 1 < end)//保证下标(start+1)和end最多只为相邻的元素 { int mid = start + (end - start) / 2;//防止程序溢出 if (nums[mid] == target) { end = mid; } else if (nums[mid] < target) { start = mid; } else if (nums[mid] > target) { end = mid; } } if (nums[start] == target) { return start; } if (nums[end] == target) { return end; } return -1; }
1.假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。
你需要找到其中最小的元素。
public int findMin(int[] num) { // write your code here int start = 0,end = num.length - 1; int target = num[end]; while (start + 1 < end) { int mid = start + (end - start)/2; if (num[mid] < target) { end = mid; } else if (num[mid] > target) { start = mid; } else if (num[mid] == target) { end = mid; } } if (num[start] <= target) { return num[start]; } else { return num[end]; } }