代码随想录

您所在的位置:网站首页 区间查找算法是什么 代码随想录

代码随想录

2023-06-10 11:56| 来源: 网络整理| 查看: 265

参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!

# 35.搜索插入位置

力扣题目链接 (opens new window)

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

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

示例 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 # 思路

这道题目不难,但是为什么通过率相对来说并不高呢,我理解是大家对边界处理的判断有所失误导致的。

这道题目,要在数组中插入目标值,无非是这四种情况。

35_搜索插入位置3

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

这四种情况确认清楚了,就可以尝试解题了。

接下来我将从暴力的解法和二分法来讲解此题,也借此好好讲一讲二分查找法。

# 暴力解法

暴力解题 不一定时间消耗就非常高,关键看实现的方式,就像是二分查找时间消耗不一定就很低,是一样的。

C++代码

class Solution { public: int searchInsert(vector& nums, int target) { for (int i = 0; i = target) { // 一旦发现大于或者等于target的num[i],那么i就是我们要的结果 return i; } } // 目标值在数组所有元素之后的情况 return nums.size(); // 如果target是最大的,或者 nums为空,则返回nums的长度 } }; 12345678910111213141516时间复杂度:O(n) 空间复杂度:O(1)

效率如下:

35_搜索插入位置

# 二分法

既然暴力解法的时间复杂度是O(n),就要尝试一下使用二分查找法。

35_搜索插入位置4

大家注意这道题目的前提是数组是有序数组,这也是使用二分查找的基础条件。

以后大家只要看到面试题里给出的数组是有序数组,都可以想一想是否可以使用二分法。

同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。

大体讲解一下二分法的思路,这里来举一个例子,例如在这个数组中,使用二分法寻找元素为5的位置,并返回其下标。

35_搜索插入位置5

二分查找涉及的很多的边界条件,逻辑比较简单,就是写不好。

相信很多同学对二分查找法中边界条件处理不好。

例如到底是 while(left < right) 还是 while(left return ((left + right) / 2) as i32, Ordering::Greater => right = mid, } } ((left + right) / 2) as i32 } } 123456789101112131415# Python class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left, right = 0, len(nums) - 1 while left 1); if (target > nums[mid]) { l = mid + 1; } else { ans = mid; r = mid - 1; } } return ans; }; 12345678910111213141516# TypeScript // 第一种二分法 function searchInsert(nums: number[], target: number): number { const length: number = nums.length; let left: number = 0, right: number = length - 1; while (left Int { var left = 0 var right = nums.count - 1 while left > 1) if nums[middle] > target { right = middle - 1 }else if nums[middle]



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3