zoukankan      html  css  js  c++  java
  • LeetCode 35 搜索插入位置

    链接:https://leetcode-cn.com/problems/search-insert-position

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

    你可以假设数组中无重复元素。

    示例 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



    这道题因为有两段性的关系,所以呢也可以用二分来做,两段性质分别是,左边的所有数都小于target,而右边的所有数都大于或等于target。那么我们定义一个check函数,看一下满足大于等于target的所有点中,第一个点的位置,那个位置就是我们所要求的解啦。check函数为 if (某个数 >= target)。那么我们要记住,当我们要算满足后面一段性质的解的时候,更新方式是 r = mid, l = mid + 1.

    可以看出来,满足后面一段的性质的表现是大于等于,满足前面一段的性质的表现是小于等于。并且解都要包含在前一段或后一段性质里面。

    c++代码如下:

     1 class Solution {
     2 public:
     3     int searchInsert(vector<int>& nums, int target) {
     4         if(nums.empty() || nums.back() < target) return nums.size();
     5         int l = 0, r = nums.size() - 1;
     6         while(l < r){
     7             int mid = l + r >> 1;
     8             if(nums[mid] >= target) r = mid;
     9             else l = mid + 1;
    10         }
    11         return r;
    12     }
    13 };

    在这道题中,开头还要错判一下,如果数组是空的,或者最后一个数都小于target,注意没有等于,等于的情况包含在下面的判断里面,那么直接返回数组的size就好。

  • 相关阅读:
    bzoj4195 [Noi2015]程序自动分析
    bzoj4236 JOIOJI hash 模拟
    bzoj1012 [JSOI2008]最大数maxnumber
    day 4 名片管理系统 -函数版
    day 3 局部变量 全局变量
    day 2 函数的嵌套
    day1 函数 (独立功能代码块)
    day 14 元组
    day 13 字典dict 操作
    day 12 列表字典 补充
  • 原文地址:https://www.cnblogs.com/hellosnow/p/11577215.html
Copyright © 2011-2022 走看看