搜索插入位置
- 题解1 二分查找
- 防越界写法
 
- 题解2 STL大法
- 两行
 
 
给定一个排序数组和一个目标值,在数组中找到目标值, 并返回其索引。如果目标值不存在于数组中, 返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O ( l o g n ) O(log n) O(logn)的算法。
示例 1:
 输入: nums = [1,3,5,6], target = 5
 输出: 2
示例 2:
 输入: nums = [1,3,5,6], target = 2
 输出: 1
示例 3:
 输入: nums = [1,3,5,6], target = 7
 输出: 4
提示:
- 1 <= nums.length<= 1 0 4 10^4 104
-  
      
       
        
        
          − 
         
        
          1 
         
         
         
           0 
          
         
           4 
          
         
        
       
         -10^4 
        
       
     −104 <= nums[i]<= 1 0 4 10^4 104
- nums为 无重复元素 的 升序 排列数组
-  
      
       
        
        
          − 
         
        
          1 
         
         
         
           0 
          
         
           4 
          
         
        
       
         -10^4 
        
       
     −104 <= target<= 1 0 4 10^4 104
题解1 二分查找
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int len = nums.size();
        int left = 0;
        int right = len-1;
        int pos = 0;
        while(left <= right){
            int mid = (left+right) >> 1;
            if(nums[mid] == target) return mid;
            else if(nums[mid] < target){
                left = mid+1;
                // left就是升序情况下 应该插入的位置
                pos = left;
            }else{
                right = mid-1;
            }
        }
        return pos;
    }
};

 
防越界写法
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0, right = n - 1, ans = n;
        while (left <= right) {
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) {
            // mid = left + (difference)>>1 (Key: 找到第一个下标,对应值 >= target)
                ans = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return ans;
    }
};

题解2 STL大法
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        auto it = find(nums.begin(),nums.end(),target);
        if(it!=nums.end()){
            return it-nums.begin();
        }
        auto first =lower_bound(nums.begin(), nums.end(), target);
        return first-nums.begin();
    }
};

两行
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        auto st = nums.cbegin(), ed = nums.cend();
        return lower_bound(st, ed, target) - st;
    }
};




















