- 题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
2. 思路:
因为这是一个有序的数组,首先想到的就是二分法,并且里面没有重复的元素,这样用二分查找返回的值就是一个固定的数
3. 代码:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int length = nums.size();
if(length == 0){
return 0;
}
int right = length - 1 ;
while(left <= right){
int mid = (right + left) / 2;
if(nums[mid] == target){
return mid;
}
if(nums[mid] > target ){
right = mid - 1;
}
if(nums[mid] < target){
left = mid + 1;
}
}
return right + 1;
}
};
- tips:
在C++中sizeof计算map或者vector的大小的时候,无论容器里面有多少元素,返回的都是固定值,这个固定值就是C++中map或者vector这个数据结构本身所占用的空间。
对于vector来说,上文实测占用24字节,分成3个8字节的ptr,分别表示vector中首个元素的地址,下一个待插入的地址和后续扩展地址(当下一个地址达到后续扩展时,容器会自动再申请一段空间)。
vector 的长度最好使用 nums.size() 来获得。