目录
LeetCode——34. 在排序数组中查找元素的第一个和最后一个位置
LeetCode——35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5 输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7 输出: 4
提示:
-
1 <= nums.length <= 104
-
-104 <= nums[i] <= 104
-
nums
为 无重复元素 的 升序 排列数组 -
-104 <= target <= 104
分析:
1.num为 无重复元素 的 升序 排列数组,适合使用二分查找算法。
2.当目标值不存在于数组中的时候,需要区分边界值。
Code
class Solution { public int searchInsert(int[] nums, int target) { int left = 0; int right = nums.length - 1; int mid = -1; while(left <= right) { mid = left + ((right - left) >> 1); // if (nums[mid] > target) { right = mid - 1; } else if (nums[mid] < target) { left = mid + 1; } else { return mid; } } return right+1; } }
-
时间复杂度:O(log n)
-
空间复杂度:O(1)
LeetCode——34. 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
你必须设计并实现时间复杂度为 O(log n)
的算法解决此问题。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]
示例 3:
输入:nums = [], target = 0 输出:[-1,-1]
提示:
-
0 <= nums.length <= 105
-
-109 <= nums[i] <= 109
-
nums
是一个非递减数组 -
-109 <= target <= 109
分析:
寻找target在数组里的左右边界,有如下三种情况:
-
情况一:target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组{3, 4, 5},target为6,此时应该返回{-1, -1}
-
情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}
-
情况三:target 在数组范围中,且数组中存在target,例如数组{3,6,7},target为6,此时应该返回{1, 1}
Code:
class Solution { public int[] searchRange(int[] nums, int target) { int left = 0; int right = nums.length - 1; int leftBoard = -1; int rightBoard = -1; while(left <= right) { int mid = left + ((right - left) >> 1); if (nums[mid] > target) { right = mid - 1; } else if (nums[mid] < target) { left = mid + 1; } else { leftBoard = mid; rightBoard = mid; // nums[leftBoard - 1]要注意左边界最小值 while(leftBoard > 0 && nums[leftBoard] == nums[leftBoard - 1]){ leftBoard--; } // nums[rightBoard + 1]要注意右边界最大值 if (nums[rightBoard] == nums[nums.length - 1]) { rightBoard = nums.length - 1; } else { while(rightBoard >= 0 && nums[rightBoard] == nums[rightBoard + 1]){ rightBoard++; } } return new int[]{leftBoard, rightBoard}; } } return new int[]{leftBoard, rightBoard}; } }
-
时间复杂度:O(log n)
-
空间复杂度:O(1)