每天一道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-----摩尔投票法寻找给定数组中出现个数大于n/2或n/3的元素
- 每天一道LeetCode-----删除序列中指定元素,将满足要求的元素移动到前面
- 每天一道LeetCode-----一个整数序列,每个元素出现两次,只有一个(两个)出现一次,找到这个(这两个)元素
- 每天一道LeetCode-----在给定序列中找到满足nums[i]>nums[i-1]&&nums[i]>nums[i+1]的位置,要求时间复杂度是O(logN)
- 每天一道LeetCode-----给定序列中2/3/4个元素的和为target的所有集合,或3个元素的和最接近target的集合
- 每天一道LeetCode-----计算最长的元素连续序列长度
- 每天一道LeetCode-----数组序列,每个元素的值表示最多可以向后跳多远,计算最少跳多少次可以到达末尾
- 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素
- 每天一道LeetCode-----某个数在递增序列第一次和最后一次出现的位置
- 每天一道LeetCode-----寻找二叉搜索树中第k小的元素
- 每天一道LeetCode-----找到序列中第一个没有出现的正整数,要求时间复杂度是O(n),空间复杂度是O(1)
- 每天一道LeetCode-----找到给定序列中所有和为某个值的集合或集合个数,序列中可以有/无重复项,集合元素顺序不同算不同集合等
- 寻找水王--寻找序列中出现次数大于一半的元素
- 每天一道LeetCode-----将数组/链表后k个元素移动到前面
- 每天一道LeetCode-----找出给定序列的所有子序列
- leetcode01 Two Sum 寻找列表中和为定值的元素位置
- 每天一道LeetCode-----给定大小为n+1的数组,元素大小在[1 : n]之间,只有一个元素会重复出现多次,找到重复的那个
- 每天一道LeetCode-----找到一个字符串在另一个字符串出现的位置,字符串内部顺序无要求
- 每天一道LeetCode-----给定一个矩阵,如果某个元素是0,就将所在行所在列上所有元素否置0
- 每天一道LeetCode-----从右向左观察一棵二叉树,返回能看到的元素