【剑斩OFFER】算法的暴力美学——搜索插入位置
一、题目描述

二、算法原理

通过题目的要求我们可以看出数组是有二段性的,所以我们把数组里面的数字分成两类:小于 target 和 大于等于 target;我们从这个数字分类可以看出可以使用查找左端点的二分查找来解决这道题目:
上道题目我们可以得知:
循环条件:left < right
判断条件:
if:nums[ mid ] < target,left = mid + 1
if:nums[ mid ] >= target,right = mid
求中点的方式:int mid = left + (right - left)/2
三、代码实现
标准代码:
class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0,right = nums.size() - 1;if(nums[right] < target) return right + 1;while(left < right){int mid = left + (right - left)/2;if(nums[mid] < target) left = mid + 1;else right = mid;}return left;}
};探测性代码:
class Solution {
public:int searchInsert(vector<int>& nums, int target) {//两种情况//1.目标值在数组中存在int left = 0,right = nums.size() - 1;while(left <= right){int mid = left + (right - left)/2;if(nums[mid] > target) right = mid - 1;else if(nums[mid] < target) left = mid + 1;else return mid;}//2.目标值不在数组中left = 0,right = nums.size() - 1;if(nums[right] < target) return nums.size();while(left < right){int mid = left + (right - left)/2;if(nums[mid] > target) right = mid;else left = mid + 1;}return left;}
};
