2021-03-08

搜索插入位置

  • 搜索插入位置
    • 1.示例
    • 2. 解题思路
    • 3. 二分查找算法
    • 4. 图示
    • 5. 代码展示及分析
    • 6.运行结果

搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。

1.示例

示例1:
输入: [1,3,5,6], 5
输出: 2
示例2:
输入: [1,3,5,6], 2
输出: 1

2. 解题思路

利用二分查找,通过二分查找来得到可以插入的位置,若插入的位置为pos,它成立的条件为:

              nums[pos−1]

在排序数组 nums 中,假设存在这个目标值,我们返回的索引也为pos,将两个条件合并得出结果:
在一个有序数组中找出第一个大于等于target 的下标。
时间复杂度:O(logn)

3. 二分查找算法

二分查找法(Binary Search)算法,也叫折半查找算法。二分查找针对的是一个有序的数据集合,查找思想有点类似于分治思想。每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一半,知道找到要查找的元素,或者区间被缩小为0。

4. 图示

2021-03-08_第1张图片
(图片转自百度;)
避免使用mid=(left+right)/2,假设lift和right比较大的话,此写法存在溢出问题。优化改为 left+((right-left)>>1 ),位运算效率相对较高,且不存在溢出问题。

5. 代码展示及分析

下面展示一些 内联代码片

//  int n = nums.size(); //判断数组是否为空;
    if(n==0){     
      return 0;  
  }
//class Solution {
public:  
  int searchInsert(vector& nums, int target) {
             int n = nums.size()
if(n==0){  
                return 0; 
                } 
else{       
     int left = 0, right = n - 1, ans = n;
 
          while (left <= right) {  
     
int mid = ((right - left) >> 1) + left; //二分搜索算法          
       if (target <= nums[mid]) {
//通过target与mid比较,若target 

6.运行结果

2021-03-08_第2张图片

2021-03-08_第3张图片
欢迎大家前来评论,共同进步!
2021-03-08_第4张图片

你可能感兴趣的:(算法,数据结构,leetcode,c++,c语言)