auto commit

This commit is contained in:
CyC2018 2019-12-01 00:20:52 +08:00
parent e800d06807
commit 40efa01bd6
2 changed files with 22 additions and 8 deletions

View File

@ -278,12 +278,12 @@ Output: [-1,-1]
题目描述给定一个有序数组 nums 和一个目标 target要求找到 target nums 中的第一个位置和最后一个位置
可以用二分查找找出第一个位置和最后一个位置但是寻找的方法有所不同需要实现两个二分查找我们将寻找 target 最后一个位置转换成寻找 target+1 第一个位置再往前移动一个位置这样我们只需要实现一个二分查找代码即可
```java
public int[] searchRange(int[] nums, int target) {
int first = binarySearch(nums, target);
int last = binarySearch(nums, target + 1) - 1;
int first = findFirst(nums, target);
int last = findFirst(nums, target + 1) - 1;
if (first == nums.length || nums[first] != target) {
return new int[]{-1, -1};
} else {
@ -291,7 +291,7 @@ public int[] searchRange(int[] nums, int target) {
}
}
private int binarySearch(int[] nums, int target) {
private int findFirst(int[] nums, int target) {
int l = 0, h = nums.length; // 注意 h 的初始值
while (l < h) {
int m = l + (h - l) / 2;
@ -305,6 +305,13 @@ private int binarySearch(int[] nums, int target) {
}
```
在寻找第一个位置的二分查找代码中需要注意 h 的取值为 nums.length而不是 nums.length - 1先看以下示例
```
nums = [2,2], target = 2
```
如果 h 的取值为 nums.length - 1那么 last = findFirst(nums, target + 1) - 1 = 1 - 1 = 0这是因为 findLeft 只会返回 [0, nums.length - 1] 范围的值对于 findFirst([2,2], 3) 我们希望返回 3 插入 nums 中的位置也就是数组最后一个位置再往后一个位置 nums.length所以我们需要将 h 取值为 nums.length从而使得 findFirst返回的区间更大能够覆盖 target 大于 nums 最后一个元素的情况

View File

@ -278,12 +278,12 @@ Output: [-1,-1]
题目描述给定一个有序数组 nums 和一个目标 target要求找到 target nums 中的第一个位置和最后一个位置
可以用二分查找找出第一个位置和最后一个位置但是寻找的方法有所不同需要实现两个二分查找我们将寻找 target 最后一个位置转换成寻找 target+1 第一个位置再往前移动一个位置这样我们只需要实现一个二分查找代码即可
```java
public int[] searchRange(int[] nums, int target) {
int first = binarySearch(nums, target);
int last = binarySearch(nums, target + 1) - 1;
int first = findFirst(nums, target);
int last = findFirst(nums, target + 1) - 1;
if (first == nums.length || nums[first] != target) {
return new int[]{-1, -1};
} else {
@ -291,7 +291,7 @@ public int[] searchRange(int[] nums, int target) {
}
}
private int binarySearch(int[] nums, int target) {
private int findFirst(int[] nums, int target) {
int l = 0, h = nums.length; // 注意 h 的初始值
while (l < h) {
int m = l + (h - l) / 2;
@ -305,6 +305,13 @@ private int binarySearch(int[] nums, int target) {
}
```
在寻找第一个位置的二分查找代码中需要注意 h 的取值为 nums.length而不是 nums.length - 1先看以下示例
```
nums = [2,2], target = 2
```
如果 h 的取值为 nums.length - 1那么 last = findFirst(nums, target + 1) - 1 = 1 - 1 = 0这是因为 findLeft 只会返回 [0, nums.length - 1] 范围的值对于 findFirst([2,2], 3) 我们希望返回 3 插入 nums 中的位置也就是数组最后一个位置再往后一个位置 nums.length所以我们需要将 h 取值为 nums.length从而使得 findFirst返回的区间更大能够覆盖 target 大于 nums 最后一个元素的情况