刚拿到题目的时候,分成两步做的。 第一步:如果target存在于我们的容器中,我就返回位置,本来想用find()函数去处理的。 但是有一点问题,这里刚好去复习一下: string中的find(),如果查找到,那么返回的是查找字符串的首地址值。 vector中的find(),是一个迭代器,如果仅仅去查找这个数是否在容器中. 这个方法是很好的。但是并不会返回位置,返回的是一个迭代器。 第二步:通过二分去查找位置,当时暴搜O(n)应该也是可以做的。
但是最后发现,其实二分直接可以包含查找的那一个过程了。…
代码如下: 其实就是二分查找的一个小模版
class Solution { public: int searchInsert(vector<int>& nums, int target) { //其实就是一个二分的过程,注意边界,向上取整还是向下取整 //尝试一下可以用find函数 int len=nums.size(); int l=0,r=len; while(l<r){ int mid=l+r>>1;//向右移,其实就是二分 if(nums[mid]>=target) r=mid;//往左边靠 else l=mid+1; } return l; } };除了这个以外,其实也想到了lower_bound()和upper_bound(),也有一点二分的感觉。 查了一下《算法笔记》:大概是这么描述的: lower_bound(first,last,val)用来寻找数组或者容器的[first,last,val)范围内第一个值≥val元素的位置(相较于迭代器,感觉这个更适用一点),如果是数组,那么返回该位置的指针;如果是容器,那么返回该位置的迭代器。 upper_bound(first,last,val)自己去类比一下叭,就是符号变了一下
class Solution { public: int searchInsert(vector<int>& nums, int target) { //直接返回位置的差值 return lower_bound(nums.begin(),nums.end(),target)-nums.begin(); } };这个是真的有点赖皮…
