ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetBook/数组和字符串/搜索插入位置

2021-01-01 15:33:22  阅读:128  来源: 互联网

标签:nums int mid 目标值 high 插入 LeetBook 字符串 low


给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/array-and-string/cxqdh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  1. mid的计算方式:mid=(low+high)/2建议改为mid=low+(high+low)/2, 因为如果二分的上界超过int型数据32bit的一半,接下来在查找靠后的位置时候,high+low可能会溢出。low+(high+low)/2可以较好规避这个问题
  2. low<high 条件判断问题:当low<=high,while循环结束时我们得到的是 low>high,此时我们可以判定target存不存在。当low<high时,while循环结束时,low==high,得出的是当target存在时,target在数组中的位置
  3. 查找区间:区间应该尽可能覆盖所有的结果,如果查询的元素可能比数组中所有元素都大,那么上界为n,本题当目标值不存在时,得到的应该在的位置可能是n,故n应该也要包含进去
  4. 本题实际上查找的应该是第一个大于等于这个目标值的位置,当存在时是等于目标值的位置,当不存在时是第一个大于这个目标值的位置,即应该插入的位置
  5. 当目标值大于nums[mid]时,目标值应该在右半部分,大于等于这个目标值的区间应该是[mid+1,high]
  6. 当目标值小于nums[mid]时,目标值在左半部分,这时候要注意,大于等于这个目标值的数也可能是mid,所以区间应该是[low,mid]

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int low = 0 ;
        int high = nums.size(); //之所以不是nums.size()-1是因为当目标数不存在时,其位置可能在n上
        int mid = 0;
        while(low<high){
            mid = low+(high-low)/2;
            if(nums[mid]<target)
                low = mid + 1; 
            else
               high = mid;   }
            return low;
         }
    
};

标签:nums,int,mid,目标值,high,插入,LeetBook,字符串,low
来源: https://blog.csdn.net/CANGYE0504/article/details/112060812

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有