您的位置:首页 > 其它

每天一道LeetCode-----寻找地增序列中第一个大于等于目标元素的位置

2017-11-04 10:30 736 查看

Search Insert Position

原题链接Search Insert Position



要求找到目标出现的位置或者应该插入的位置,本质上就是找第一个大于等于目标元素的位置,直接调用
lower_bound
就解决了。当然也可以自己利用二分法重新实现

class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
//auto it = lower_bound(nums.begin(), nums.end(), target);
//return it - nums.begin();

/*
* 如果只有一个元素,会直接返回0
* 如果所有元素都小于target,会返回nums.size() - 1,需要加1
* 所以需要返回后判断一次nums[left]的大小
*/
int left = equalLeftBound(nums, target);
if(nums[left] < target)
return left + 1;
else
return left;
}

private:
/* 找到第一个出现target的位置 */
int equalLeftBound(vector<int>& nums, int target)
{
int left = 0;
int right = nums.size() - 1;

while(left < right)
{
int middle = (left + right) / 2;
if(nums[middle] < target)
left = middle + 1;
else
right = middle;
}

return left;
}
};


First Bad Version

原题链接First Bad Version



找到第一个isBadVersion(version)返回true的位置,和上面的一样。不过需要注意的地方是二分法求中点时(left + right) / 2可能会溢出,可以采用left + (right - left) / 2的方式避免溢出

// Forward declaration of isBadVersion API.
bool isBadVersion(int version);

class Solution {
public:
int firstBadVersion(int n) {
return equalLeftBound(n);
}

private:
int equalLeftBound(int n)
{
int left = 1;
int right = n;
while(left < right)
{
int middle = left + (right - left) / 2;
bool isBad = isBadVersion(middle);
if(!isBad)
left = middle + 1;
else
right = middle;

/* 加不加都行,因为是左边界,不存在无限循环的问题 */
//if(isBadVersion(left))
//     break;
// else
//    ++left;
}

return left;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode
相关文章推荐