数据结构与算法学习【算法思想之二分法】
本文学习目标或巩固的知识点
- 学习二分法类题目
- 巩固基础的二分法
- 在二分法的基础上提升
提前说明:算法题目来自力扣、牛客等等途径
LC-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]
通过题目可知
- 如果目标值不在数组中则返回[-1, -1]即可
- 数组是有序递增的,如果能找到目标值,那么就需要找出目标值在数组中的开始位置和结束位置。
题解
通过分析,如果能找到目标值那么如果就可以两边扩展寻找起始位置,目标值可能有重复的,也可能没有重复的。
class Solution {
public int[] searchRange(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int ans1 = -1;
int ans2 = -1;;
while(left <= right){
int mid = left + (right - left)/2;
if(nums[mid] == target){
ans1 = mid;
ans2 = mid;
//左边判断
while((ans1-1) >=0 && nums[ans1] == nums[ans1-1]){
ans1--;
}
//右边判断
while((ans2+1) < nums.length && nums[ans2] == nums[ans2+1]){
ans2++;
}
break;
}else if(nums[mid] < target){
left = mid + 1;
}else{
right = mid - 1;
}
}
return new int[]{ans1,ans2};
}
}