zoukankan      html  css  js  c++  java
  • LeetCode#35-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
    

    二、题解

    • 解法1:暴力求解

    一开始想的是遍历数组,比较当前元素和目标值,如果相等,就返回当前元素的下标。

    可如果数组里没有与目标值相同的元素呢?难不成从头遍历,去找比目标值小的元素么?

    因此设置一个 pos,遍历数组时,判断当前元素是否小于目标值,如果小于目标值,就将 pos 加 1,如果找到和目标值相同的元素,就返回该元素的下标。如果遍历到尾没有找到该元素,就返回这个 pos即为要插入的位置。

    时间复杂度:O(n),空间复杂度:O(1)。

    function searchInsert($nums, $target) {
        $pos = 0;
        foreach ($nums as $k => $v) {
            if ($v < $target) {
                $pos++;
            }
            if ($v == $target) {
                return $k;
            } 
        }
        return $pos;
    }
    
    • 解法2:二分查找

    题目已经给出了关键词——排序数组。那无疑就是用“二分查找”了。二分查找的原理及实现可以参见数据结构与算法之PHP查找算法(二分查找)

    整体思路和普通的二分查找几乎没有区别,先设定起点下标 start 和终点下标 end,再计算中间下标 mid,每次根据 nums[mid]target 之间的大小进行判断,相等则直接返回下标。

    但根据题意,如果目标值不存在于数组中,返回它将会被按顺序插入的位置。因此查找结束如果没有相等值则返回 start,该值为插入位置。

    时间复杂度:log(n),空间复杂度:O(1)。

    function searchInsert2($nums, $target) {
        $start = 0;
        $end = count($nums) - 1;
        while ($start <= $end) {
            $mid = floor(($start + $end) / 2);
            if ($target == $nums[$mid]) {
                return $mid;
            } elseif ($target < $nums[$mid]) {
                $end = $mid - 1;
            } else {
                $start = $mid + 1;
            }
        }
        return $start; //要插入的位置
    }
    
  • 相关阅读:
    pyqt 过滤事件
    python 编码问题
    xpath使用
    BeautifulSoup
    webpack.config.js 大概架构(3)
    图片,html,和其他的打包(2)
    今天开始第一篇
    第一次面试前端,记录下
    阻止默认事件和冒泡
    cookit localStorage sessionStorage 区别
  • 原文地址:https://www.cnblogs.com/sunshineliulu/p/12683091.html
Copyright © 2011-2022 走看看