最新域名网站,网站如何制作多少钱,锦阳商城网站,深圳施工图制作二分查找#xff08;Java实现#xff09;#xff08;1#xff09;
leetcode 34.排序数组中查找元素第一个和最后一个位置
题目描述:
给你一个按照非递减顺序排列的整数数组 nums#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如…二分查找Java实现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 1e5-1e9 nums[i] 1e9nums 是一个非递减数组-1e9 target 1e9
解题思路
首先我们根据题意可以将target分为三种情况 情况一、 target不在数组范围内 情况二、target在数组范围内但是数组中没有这个值 情况三、target在数组中
使用二分的条件
数组有序要求的结果单一
该问题符合有序的特征但是条件准确来说有两个即左边界和右边界。
此时我们可以将问题拆分开来看即先求左边界再求右边界。
对于左边界我们是为了求数组中不小于target的值的最小位置。对于右边界我们是为了求数组中不大于target的值的最大位置。
我们可以将这两个问题每一个单独看作要求的结果符合二分使用条件
分开来求。
我们使用全闭区间对于左边界而言我们当 arr[mid] target的时候r mid - 1。这样最终求得的结果就是符合条件的位置 - 1.
同理对于有边界而言是符合条件的位置 1 。
因此 if(r - l 1) return new int[]{l 1, r - 1};返回的便是最终结果。其余两种情况分别为无解。
代码
class Solution {public int[] searchRange(int[] nums, int target) {int n nums.length;int l get_left(nums, target, n);int r get_right(nums, target, n);if(l -2 || r -2) return new int[]{-1, -1};if(r - l 1) return new int[]{l 1, r - 1};return new int[]{-1, -1};}public static int get_right(int nums[], int target, int n) {int l 0, r n - 1;int idx -2;while( l r) {int mid (l r) / 2;if(nums[mid] target) {l mid 1;idx l;} else {r mid - 1;}}return idx;}public static int get_left(int nums[], int target, int n) {int l 0, r n - 1;int idx -2;while(l r) {int mid (l r) / 2;if(nums[mid] target) {r mid - 1;idx r;}else l mid 1;}return idx;}}704、二分查找
题目描述
704. 二分查找
已解答
简单
相关标签
相关企业
给定一个 n 个元素有序的升序整型数组 nums 和一个目标值 target 写一个函数搜索 nums 中的 target如果目标值存在返回下标否则返回 -1。
示例 1:
输入: nums [-1,0,3,5,9,12], target 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4示例 2:
输入: nums [-1,0,3,5,9,12], target 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1提示
你可以假设 nums 中的所有元素是不重复的。n 将在 [1, 10000]之间。nums 的每个元素都将在 [-9999, 9999]之间。
题解
本题可以使用二分同时我们使用全开区间进行求解
对于nums[mid] target的r mid - 1。
对于nums[mid] target的l mid 1;
相同返回结果。
然后我们需要考虑到会有数组过于小导致没有进循环的情况返回结果使用一个三目运算符判断就是最终结果了。
代码
class Solution {public int search(int[] nums, int target) {int l 0; int r nums.length - 1;while( l r) {int mid (l r) / 2;if(nums[mid] target) r mid - 1;else if(nums[mid] target) l mid 1;else return mid;}return nums[l] target ? l : -1;}
}