34:在排序数组中查找元素的第一个和最后一个位置
This commit is contained in:
parent
ad099f533f
commit
4682f09d34
@ -0,0 +1,115 @@
|
|||||||
|
//给定一个按照升序排列的整数数组 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
|
||||||
|
//
|
||||||
|
// Related Topics 数组 二分查找
|
||||||
|
// 👍 961 👎 0
|
||||||
|
|
||||||
|
package leetcode.editor.cn;
|
||||||
|
|
||||||
|
//34:在排序数组中查找元素的第一个和最后一个位置
|
||||||
|
public class FindFirstAndLastPositionOfElementInSortedArray {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
//测试代码
|
||||||
|
Solution solution = new FindFirstAndLastPositionOfElementInSortedArray().new Solution();
|
||||||
|
solution.searchRange(new int[]{5,7,7,8,8,10},8);//3,4
|
||||||
|
solution.searchRange(new int[]{5, 7, 7, 8, 8, 10}, 6);//-1,-1
|
||||||
|
solution.searchRange(new int[]{2, 2}, 3);//-1,-1
|
||||||
|
solution.searchRange(new int[]{1, 4}, 4);//1,1
|
||||||
|
solution.searchRange(new int[]{0, 1, 2, 3, 4, 4, 4}, 2);//2,2
|
||||||
|
}
|
||||||
|
|
||||||
|
//力扣代码
|
||||||
|
//leetcode submit region begin(Prohibit modification and deletion)
|
||||||
|
class Solution {
|
||||||
|
public int[] searchRange(int[] nums, int target) {
|
||||||
|
int length = nums.length;
|
||||||
|
if (nums.length == 0 || nums[0] > target || nums[length - 1] < target) {
|
||||||
|
return new int[]{-1, -1};
|
||||||
|
}
|
||||||
|
int start = 0;
|
||||||
|
int end = nums.length - 1;
|
||||||
|
int mid = 0;
|
||||||
|
while (start <= end) {
|
||||||
|
mid = (start + end) / 2;
|
||||||
|
while (nums[mid] < target) {
|
||||||
|
start = mid + 1;
|
||||||
|
if (mid == (mid + end) / 2) {
|
||||||
|
if (mid == end) {
|
||||||
|
return new int[]{-1, -1};
|
||||||
|
} else {
|
||||||
|
mid = end;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mid = (mid + end) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (nums[mid] > target) {
|
||||||
|
end = mid - 1;
|
||||||
|
if (mid == mid / 2) {
|
||||||
|
if (mid == 0) {
|
||||||
|
return new int[]{-1, -1};
|
||||||
|
} else {
|
||||||
|
mid = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mid /= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(nums[mid] == target){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nums[mid] != target) {
|
||||||
|
return new int[]{-1, -1};
|
||||||
|
}
|
||||||
|
start = mid;
|
||||||
|
end = mid;
|
||||||
|
while (start > 0 && nums[start - 1] == target) {
|
||||||
|
start--;
|
||||||
|
}
|
||||||
|
while (end < nums.length - 1 && nums[end + 1] == target) {
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
return new int[]{start, end};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//leetcode submit region end(Prohibit modification and deletion)
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
<p>给定一个按照升序排列的整数数组 <code>nums</code>,和一个目标值 <code>target</code>。找出给定目标值在数组中的开始位置和结束位置。</p>
|
||||||
|
|
||||||
|
<p>如果数组中不存在目标值 <code>target</code>,返回 <code>[-1, -1]</code>。</p>
|
||||||
|
|
||||||
|
<p><strong>进阶:</strong></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>你可以设计并实现时间复杂度为 <code>O(log n)</code> 的算法解决此问题吗?</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
<p><strong>示例 1:</strong></p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<strong>输入:</strong>nums = [<code>5,7,7,8,8,10]</code>, target = 8
|
||||||
|
<strong>输出:</strong>[3,4]</pre>
|
||||||
|
|
||||||
|
<p><strong>示例 2:</strong></p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<strong>输入:</strong>nums = [<code>5,7,7,8,8,10]</code>, target = 6
|
||||||
|
<strong>输出:</strong>[-1,-1]</pre>
|
||||||
|
|
||||||
|
<p><strong>示例 3:</strong></p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<strong>输入:</strong>nums = [], target = 0
|
||||||
|
<strong>输出:</strong>[-1,-1]</pre>
|
||||||
|
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
<p><strong>提示:</strong></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><code>0 <= nums.length <= 10<sup>5</sup></code></li>
|
||||||
|
<li><code>-10<sup>9</sup> <= nums[i] <= 10<sup>9</sup></code></li>
|
||||||
|
<li><code>nums</code> 是一个非递减数组</li>
|
||||||
|
<li><code>-10<sup>9</sup> <= target <= 10<sup>9</sup></code></li>
|
||||||
|
</ul>
|
||||||
|
<div><div>Related Topics</div><div><li>数组</li><li>二分查找</li></div></div>\n<div><li>👍 961</li><li>👎 0</li></div>
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user