代码随想录 |
您所在的位置:网站首页 › 区间查找算法是什么 › 代码随想录 |
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益! # 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 # 思路这道题目不难,但是为什么通过率相对来说并不高呢,我理解是大家对边界处理的判断有所失误导致的。 这道题目,要在数组中插入目标值,无非是这四种情况。 目标值在数组所有元素之前 目标值等于数组中某一个元素 目标值插入数组中的位置 目标值在数组所有元素之后这四种情况确认清楚了,就可以尝试解题了。 接下来我将从暴力的解法和二分法来讲解此题,也借此好好讲一讲二分查找法。 # 暴力解法暴力解题 不一定时间消耗就非常高,关键看实现的方式,就像是二分查找时间消耗不一定就很低,是一样的。 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)效率如下: # 二分法既然暴力解法的时间复杂度是O(n),就要尝试一下使用二分查找法。 大家注意这道题目的前提是数组是有序数组,这也是使用二分查找的基础条件。 以后大家只要看到面试题里给出的数组是有序数组,都可以想一想是否可以使用二分法。 同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。 大体讲解一下二分法的思路,这里来举一个例子,例如在这个数组中,使用二分法寻找元素为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 |