一.题目
给定一个n个元素有序的(升序)整形数组num和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。
提示:
- 你可以假设
nums
中的所有元素是不重复的。 n
将在[1, 10000]
之间。nums
的每个元素都将在[-9999, 9999]
之间。
二分查找的前提条件:数组为有序数组且无重复元素 。在刷题时,如果满足以上条件,可以率先考虑二分查找法。
解析:数组首元素定义L,尾元素定义R,求mid时用L+(R-L)/2 可以防止数据溢出。当中间值(nums[mid])大于目标值,R放到mid-1位置处,当中间值(nums[mid])小于标值,L放到mid+1位置处。
注意:1.循环条件是while(L<=R),因为L==R是有意义的,所以用<=。
2.如示例一,寻找中间值算出来mid为2.5,但因为是整型,所以结果为2。
知识补充:vector是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
特点
1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
代码实现: