搜索插入位置
讨论 1
思路
这道题目要求我们在一个已经排好序的数组中查找目标值,如果目标值存在,则返回其下标,否则返回它按顺序插入的位置。由于数组已经排好序,因此我们可以考虑使用二分查找算法,以达到时间复杂度为 O(log n) 的要求。
具体来说,我们可以使用两个指针 left 和 right 分别表示当前查找区间的左右边界。初始时,左边界为 0,右边界为数组长度减 1。然后,我们可以使用 while 循环,每次将查找区间缩小一半,直到找到目标元素或者查找区间为空。
在每次循环中,我们可以计算中间位置 mid,然后判断 nums[mid] 与目标值的大小关系。如果 nums[mid] == target,则直接返回 mid;否则,如果 nums[mid] < target,则目标元素可能在 mid 的右侧,因此更新左边界为 mid + 1;否则,更新右边界为 mid - 1。最终,如果找到了目标元素,则返回其下标;否则返回左边界,即目标元素应该插入的位置。
关键点
计算中间位置:在每次循环中,需要计算中间位置 mid,可以使用 left 和 right 两个指针计算得出,mid = left + (right - left) / 2。
判断目标元素是否存在于数组中:如果找到了目标元素,则返回其下标;否则,返回左边界 left,即目标元素应该插入的位置。如果数组中不存在与目标值相等的元素,最终的 left 变量将指向目标元素应该插入的位置。因此,当返回值为 left 时,可以认为目标值不存在于数组中。
class Solution {
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int left = 0, right = n - 1, ans = n;
while (left <= right) {
int mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}
}
山脉数组的顶峰索引
讨论 1
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int n = arr.length;
int ans = -1;
for (int i = 1; i < n - 1; ++i) {
if (arr[i] > arr[i + 1]) {
ans = i;
break;
}
}
return ans;
}
}
讨论 2
public int peakIndexInMountainArray(int[] A) {
// 1.[定左右]
int l = 0;
int r = A.length-1;
// 2.[定区间]
while (l <= r) {// [l,r]
// 3.[取中值]
int mid = l + (r-l)/2;
// 4.[进退]
if (A[mid+1] > A[mid]) {// 上坡
l = mid + 1; // [爬坡]
} else if (A[mid-1] > A[mid]){// 下坡
r = mid - 1; // [返回坡顶]
} else {
return mid;
}
}
// 5.[无功而返]
return -1;
}
mid
放中间 天下分三边,左右裁剪 取中间
!
mid
放右边 天下分两边,左裁剪来 右缩界!取得最左解
。
mid
放左边 天下分两边,右裁剪来 左缩界!取得最右解
。