
 解题思路:
  
     
      
       
        
       
      
        \qquad 
       
      
    时间复杂度要求为O(Log N),可知此题用二分查找解决。
  
     
      
       
        
       
      
        \qquad 
       
      
    二分基本思路是,通过锚定一个中间值mid,把搜索区间一分为二,根据mid与目标值的比较结果,更新下一次搜索区间(左半边或右半边),直至区间大小为1。
 
     
      
       
        
       
      
        \qquad 
       
      
    二分其实是有模版的,而且有两种:一种是从左向右找到第一个  
     
      
       
       
         ≥ 
        
       
      
        \geq 
       
      
    ≥ target 的位置(对应移动l),另一种是从右向左找到第一个  
     
      
       
       
         ≤ 
        
       
      
        \leq 
       
      
    ≤ target的位置(对应移动r)。
  
     
      
       
        
       
      
        \qquad 
       
      
    由于本题中,有序数组中无重复元素,且如果没找到此元素时,返回要插入的位置,可以使用模版一来解决。
 
     
      
       
        
       
      
        \qquad 
       
      
    定义区间的边界l和r初始化为[0, N-1]。要找第一个  
     
      
       
       
         ≥ 
        
       
         t 
        
       
         a 
        
       
         r 
        
       
         g 
        
       
         e 
        
       
         t 
        
       
      
        \geq target 
       
      
    ≥target 的位置,即该位置左边的所有元素均小于target。因此当nums[mid] < target时,更新l = mid+1,否则即nums[mid] >= target时,r = mid。最后的退出条件是l == r,通过不断移动l来保证r是第一个大于或等于target的元素。
 
     
      
       
        
       
      
        \qquad 
       
      
    有一点需要注意:由于l和r的取值范围都在[0, N-1]内,题目存在一中特殊情况,即所有元素小于target时,返回nums.size()需要特殊处理下。
	int searchInsert(vector<int>& nums, int target) {
        int l = 0, r = nums.size()-1, mid = 0;
        if(nums[nums.size()-1] < target) return nums.size();
        while(l < r)
        {
           mid = (l + r) / 2;
           if(nums[mid] < target)
           {
                l = mid + 1;
           }
           else
           {
                r = mid;
           }
        }
        return l;
    }



















