写在前面
最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。
目录
- 写在前面
- 一、场景描述
- 二、具体步骤
- 1.环境说明
- 2.代码
- 写在后面
一、场景描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
二、具体步骤
1.环境说明
名称 | 说明 |
---|---|
IntelliJ IDEA | 2019.2 |
2.代码
以下为Java版本实现:
public class Lc34_searchRange {public static void main() {int[] nums = new int[]{5,7,7,8,8,10};System.out.println(Arrays.toString(searchRange(nums, 8)));int[] nums1 = new int[]{5,7,7,8,8,10};System.out.println(Arrays.toString(searchRange(nums1, 6)));}/*** 思路:** 返回值值int[]** 有序数组,时间复杂度是O(log n)* 一定是借助于二分查找,找到mid* 然后从mid位置开始,lr左右指针向两边扩展,范围是在在low和high之间* 返回时需要各自回退一个指针(初始化l=mid,r=mid,首次循环一定成立)** 如果找不到mid,直接返回int[]{-1, -1}*/public static int[] searchRange(int[] nums, int target) {if (target < nums[0] || target > nums[nums.length - 1]) {return new int[] {-1, -1};}int low = 0, high = nums.length - 1;while (low <= high) {// 注意移位运算符的优先级要比+-低,所以要多加一个括号int mid = low + ((high - low) >> 1);if (target == nums[mid]) {// 找到了,即target// 从mid位置开始向两边扩展int l = mid, r = mid;while (l >= low && nums[l] == target) {l--;}while (r <= high && nums[r] == target) {r++;}// 回退一次return new int[] {++l, --r};} else if (target < nums[mid]) {high = mid - 1;} else {low = mid + 1;}}return new int[]{-1, -1};}}
写在后面
如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。