Day03——数组专题 ╰+哭是因爲堅強的太久メ 2024-04-03 10:29 88阅读 0赞 #### 文章目录 #### * * * 6.搜索插入位置: * 二分法: * 7.在排序数组中查找元素的第一个和最后一个位置: * 寻找右边界 * 寻找左边界 * 处理三种情况 -------------------- #### 6.搜索插入位置: #### **思路:** * 目标值在数组所有元素之前 * 目标值等于数组中某一个元素 * 目标值插入数组中的位置 * 目标值在数组所有元素之后 #### 二分法: #### 1.看到题里给出的数组是有序数组,都可以想一想是否可以使用**二分法**。 **代码实现:** class Solution { public int searchInsert(int[] nums, int target) { int n = nums.length; // 定义target在左闭右闭的区间,[low, high] int low = 0; int high = n - 1; while (low <= high) { // 当low==high,区间[low, high]依然有效 int mid = low + (high - low) / 2; // 防止溢出 if (nums[mid] > target) { high = mid - 1; // target 在左区间,所以[low, mid - 1] } else if (nums[mid] < target) { low = mid + 1; // target 在右区间,所以[mid + 1, high] } else { // 1. 目标值等于数组中某一个元素 return mid; return mid; } } // 2.目标值在数组所有元素之前 3.目标值插入数组中 4.目标值在数组所有元素之后 return right + 1; return high + 1; } } #### 7.在排序数组中查找元素的第一个和最后一个位置: #### 寻找target在数组里的左右边界,有如下三种情况: * 情况一:target 在数组范围的右边或者左边,例如数组\{3, 4, 5\},target为1或者数组\{3, 4, 5\},target为9,此时应该返回\{-1, -1\} * 情况二:target 在数组范围中,且数组中不存在target,例如数组\{3,5,7\},target为4,此时应该返回\{-1, -1\} * 情况三:target 在数组范围中,且数组中存在target,例如数组\{3,6,7\},target为6,此时应该返回\{1, 1\} #### 寻找右边界 #### int getRightBorder(int[] nums, int target) { int left = 0; int right = nums.length - 1; int rightBorder = -2; // 记录一下rightBorder没有被赋值的情况 while (left <= right) { int middle = left + ((right - left) / 2); if (nums[middle] > target) { right = middle - 1; } else { // 寻找右边界,nums[middle] == target的时候更新left left = middle + 1; rightBorder = left; } } return rightBorder; } #### 寻找左边界 #### int getLeftBorder(int[] nums, int target) { int left = 0; int right = nums.length - 1; int leftBorder = -2; // 记录一下leftBorder没有被赋值的情况 while (left <= right) { int middle = left + ((right - left) / 2); if (nums[middle] >= target) { // 寻找左边界,nums[middle] == target的时候更新right right = middle - 1; leftBorder = right; } else { left = middle + 1; } } return leftBorder; } #### 处理三种情况 #### class Solution { int[] searchRange(int[] nums, int target) { int leftBorder = getLeftBorder(nums, target); int rightBorder = getRightBorder(nums, target); // 情况一 if (leftBorder == -2 || rightBorder == -2) return new int[]{ -1, -1}; // 情况三 if (rightBorder - leftBorder > 1) return new int[]{ leftBorder + 1, rightBorder - 1}; // 情况二 return new int[]{ -1, -1}; } int getRightBorder(int[] nums, int target) { int left = 0; int right = nums.length - 1; int rightBorder = -2; // 记录一下rightBorder没有被赋值的情况 while (left <= right) { int middle = left + ((right - left) / 2); if (nums[middle] > target) { right = middle - 1; } else { // 寻找右边界,nums[middle] == target的时候更新left left = middle + 1; rightBorder = left; } } return rightBorder; } int getLeftBorder(int[] nums, int target) { int left = 0; int right = nums.length - 1; int leftBorder = -2; // 记录一下leftBorder没有被赋值的情况 while (left <= right) { int middle = left + ((right - left) / 2); if (nums[middle] >= target) { // 寻找左边界,nums[middle] == target的时候更新right right = middle - 1; leftBorder = right; } else { left = middle + 1; } } return leftBorder; } }
相关 Day06——数组专题 文章目录 12.水果成篮 13.螺旋矩阵 -------------------- 12.水果成篮 移动窗口解决:定义i 谁借莪1个温暖的怀抱¢/ 2024年04月03日 11:38/ 0 赞/ 78 阅读
相关 Day05——数组专题 文章目录 10.移动零 11.删除有序数组的重复项 -------------------- 10.移动零 快慢指针解决 快来打我*/ 2024年04月03日 11:11/ 0 赞/ 97 阅读
相关 Day04——数组专题 文章目录 8.有效的完全数平方 9. x 的平方根 -------------------- 8.有效的完全数平方 小鱼儿/ 2024年04月03日 10:48/ 0 赞/ 85 阅读
相关 Day03——数组专题 文章目录 6.搜索插入位置: 二分法: 7.在排序数组中查找元素的第一个和最后一个位置: ╰+哭是因爲堅強的太久メ/ 2024年04月03日 10:29/ 0 赞/ 89 阅读
相关 《剑指offer》专题—算法训练 day03 文章目录 《剑指offer》专题—算法训练day03 一、青蛙跳台阶 思路 二、矩形覆盖 思路 三、链表中倒数第k个结点 朴灿烈づ我的快乐病毒、/ 2022年09月12日 14:52/ 0 赞/ 149 阅读
相关 Day-03 1.Python缩进使用4个空格,如果你的项目和别人的项目合并时不缩进使用的不相同就会出问题 2.断行,使用 \\ 或者 ()例如: a = 1 + 2 \ 谁借莪1个温暖的怀抱¢/ 2022年06月09日 13:39/ 0 赞/ 172 阅读
相关 Java学习day03笔记-数组_字符串 1.数组 概述: 数组就是一个容器,可以存储多个相同类型的数据 ,数组的长度是固定的 语法: 1. r囧r小猫/ 2022年05月25日 23:37/ 0 赞/ 202 阅读
相关 day03 ![1757605-20190801194819881-1027321934.png][] ![1757605-20190801194608384-257171764.png 约定不等于承诺〃/ 2021年11月02日 14:12/ 0 赞/ 443 阅读
还没有评论,来说两句吧...