算法21,搜索插入位置
一道经典的二分查找应用题通常被称为“搜索插入位置”。笔记中的思路非常清晰下面为你整理这道题的具体解法、代码实现以及需要注意的细节。1. 题目理解题目描述给定一个排序数组和一个目标值在数组中找到目标值并返回其索引。如果目标值不存在于数组中返回它将会被按顺序插入的位置。核心要求时间复杂度为 O(logN)这意味着必须使用二分查找。关键结论这道题本质上是在寻找数组中第一个大于等于目标值 target的元素位置。2. 算法思路基于笔记笔记中总结了寻找“左边界”的逻辑这正是解决此题的核心初始化左指针left 0右指针right nums.length - 1。循环条件while (left right)。注意这里不能写成left right因为当left right时我们已经找到了唯一的目标位置应该退出循环直接返回。中间值计算int mid left (right - left) / 2;防止整数溢出。比较与收缩如果nums[mid] target说明目标值在右边且肯定不是mid所以left mid 1。如果nums[mid] target说明目标值在左边或者是mid本身我们需要继续向左寻找第一个满足条件的位置所以right mid。返回结果循环结束时left和right指向同一个位置这个位置就是我们要找的插入点。直接返回left即可。3. 代码实现Javapublic int searchInsert(int[] nums, int target) { int left 0; int right nums.length - 1; // 循环条件left right while (left right) { int mid left (right - left) / 2; if (nums[mid] target) { // 目标在右侧且 mid 已经排除 left mid 1; } else { // 目标在左侧或等于 mid保留 mid收缩右边界 // 这里的 else 涵盖了 nums[mid] target 的情况 right mid; } } // 根据题意数组为空时也应返回0上述逻辑天然支持 return left; }4. 细节辨析为什么返回left笔记右下角有一个手写的补充说明“if (nums[left] target) return left 1;”。其实在使用while (left right)和right mid这种模板时循环结束后的left已经具有了“第一个大于等于 target 的位置”的性质不需要额外的 if 判断。我们可以推演一下那个手写逻辑的场景场景 A如果循环结束时nums[left] target。说明left就是我们要插入的位置或者是已经存在的目标。此时直接返回left。场景 B如果循环结束时nums[left] target。这种情况只可能发生在left指向了数组的最后一个元素之后即left nums.length。为什么会这样因为当mid计算到最后几个元素时如果它们都小于targetleft会不断被推到mid 1直到越出数组边界。此时left指向的位置确实是原数组长度也就是正确的插入位置。(注但在 Java 中如果数组长度是 5right最大只能是 4所以left最大也只能是 5。当left5时nums[left]会越界。因此最安全的写法就是直接return left无需先判断。)总结笔记中的代码逻辑是非常标准的“寻找左边界”模板直接返回left即可完美解决该问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2604117.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!