第一天 二分查找

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 }

 

上一篇:【leetcode】数组归纳


下一篇:Springboot笔记<11>面向切面编程AOP