【简单】leetcode35.搜索插入位置

35.搜索插入位置

一、题目描述

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

请必须使用时间复杂度为 O(log n) 的算法。

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

二、思路

插入位置共有四种情况:

  • 目标值在所有元素之前
  • 目标值等于数组中某一元素
  • 目标值插入数组中的某个位置
  • 目标值在所有元素之后

 首先是有序数组+查找元素,可以使用二分法。区间为左闭右闭。

  • 目标值在所有元素之前【0,right + 1】(二分法结束后right = -1)
  • 目标值等于数组中某一元素【middle】
  • 目标值插入数组中的某个位置【right+ 1】(二分法结束后,right在最后一个小于目标值的位置)
  • 目标值在所有元素之后【right + 1】
class Solution {
public:
    int searchInsert(vector& nums, int target) {
        int n = nums.size();
        int left = 0;
        int right = n - 1; // 定义target在左闭右闭的区间里,[left, right]
        while (left <= right) { // 当left==right,区间[left, right]依然有效
            int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
            if (nums[middle] > target) {
                right = middle - 1; // target 在左区间,所以[left, middle - 1]
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右区间,所以[middle + 1, right]
            } else { // nums[middle] == target
                return middle;
            }
        }
        // 分别处理如下四种情况
        // 目标值在数组所有元素之前  [0, -1]
        // 目标值等于数组中某一个元素  return middle;
        // 目标值插入数组中的位置 [left, right],return  right + 1
        // 目标值在数组所有元素之后的情况 [left, right], 因为是右闭区间,所以 return right + 1
        return right + 1;
    }
};

 

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