34:在排序数组中查找元素的第一个和最后一个位置

This commit is contained in:
huangge1199@hotmail.com 2021-04-20 22:53:47 +08:00
parent ad099f533f
commit 4682f09d34
3 changed files with 157 additions and 1 deletions

View File

@ -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)
}

View File

@ -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