1. Binary Search
一个升序的整型数组,数组中的数字不重复。写一个函数,要求输入目标数字,返回这个
目标数字在数组里的下标,不存在则返回-1
要求时间复杂度为O(log n)
Solution By C:
1 int search(int* nums, int numsSize, int target){ 2 3 int left = 0; 4 int right = numsSize-1; 5 int mid = 0; 6 while(left<=right) { 7 mid = (right-left)>>1 + left; 8 if(nums[mid] > target) { 9 right = middle-1; 10 } 11 else if(nums[mid] < target) { 12 left = mid+1; 13 } 14 else if(nums[mid] == target){ 15 return mid; 16 } 17 } 18 19 return -1; 20 }
2. First Bad Version
数组[1,2,3,4...,n]中存储的是n个版本的版本号,现提供一个函数 isBadVersion,输入版本号,返回
True或False表示版本的好坏。如果某版本是坏的,那他后面的版本也必然是坏的。现在要求写一个函数,
实现最少次调用isBadVersion,返回最初坏掉的那个版本号。
Solution By C:
1 // The API isBadVersion is defined for you. 2 // bool isBadVersion(int version); 3 4 int firstBadVersion(int n) { 5 int left = 1, right = n; 6 while (left < right) { // 循环直至区间左右端点相同 7 int mid = left + (right - left) >> 1; // 防止计算时溢出 8 if (isBadVersion(mid)) { 9 right = mid; // 答案在区间 [left, mid] 中 10 } else { 11 left = mid + 1; // 答案在区间 [mid+1, right] 中 12 } 13 } 14 // 此时有 left == right,区间缩为一个点,即为答案 15 return left; 16 17 }
3. Search Insert Position
一个不包含相同值的升序数组,给定一个目标值,返回目标值在数组中的索引。
如果不存在,返回它将要被插入的位置。
1 int searchInsert(int* nums, int numsSize, int target) { 2 int left = 0, right = numsSize - 1; 3 while (left <= right) { 4 int mid = ((right - left) >> 1) + left; 5 if (target <= nums[mid]) 6 right = mid -1; 7 else 8 left = mid + 1; 9 } 10 return left; 11 }