严格递增序列找=target的下标
思路:
- 初始化
初始化下标pos = -1 - 区间[left, right] = [0, len-1]
① 中间元素 > 目标数 → 右区间 = 中间元素 - 1
② 中间元素 < 目标数 → 左区间 = 中间元素 + 1
③ 中间元素 = 目标数 → 返回中间元素位置
代码:
int left = 0, right = len-1;
while(left<=right)
{
int mid = left+(right-left)/2; // 避免溢出
if (nums[mid] > target) //情况1
right = mid -1;
else if (nums[mid] < target) //情况2
left = mid + 1;
else return mid; //情况3
}
return -1; //未找到该元素
非递减序列(有重复的递增序列)找第一个>=target的下标
思路:
- 初始化
初始化下标pos = len(序列长度) - 区间[left, right] = [0, len-1]
① 中间元素 > 目标数 → 右区间 = 中间元素 - 1,保存中间元素下标
② 中间元素 < 目标数 → 左区间 = 中间元素 + 1
③ 中间元素 = 目标数 → 右区间 = 中间元素 - 1,保存中间元素下标
代码:
int left=0, right=len-1;
int pos = len; //初始化要返回的下标
while(left <= right)
{
int mid = left + (right-left)/2;
if(nums[mid] >= target)
{
pos = mid;
right = mid-1;
}
else if(nums[mid] < target)
left = mid+1;
}
return pos;
非递减序列(有重复的递增序列)找第一个>target的下标
思路:
- 初始化
初始化下标pos = len(序列长度) - 区间[left, right] = [0, len-1]
① 中间元素 > 目标数 → 右区间 = 中间元素 - 1,保存中间元素下标
② 中间元素 < 目标数 → 左区间 = 中间元素 + 1
③ 中间元素 = 目标数 → 左区间 = 中间元素 + 1
代码:
int left = 0, right = len-1;
int pos = len;
while(left <= right)
{
int mid = left+(right-left)/2;
if(nums[mid] > target)
{
pos = mid;
right = mid-1;
}
else if(nums[mid] < target)
left = mid+1;
else left = mid+1;
}
return pos;
非递减序列(有重复的递增序列)找第一个=target的下标(下边界)
思路:
- 初始化
初始化下标pos = -1(不存在该元素) - 区间[left, right] = [0, len-1]
① 中间元素 > 目标数 → 右区间 = 中间元素 - 1
② 中间元素 < 目标数 → 左区间 = 中间元素 + 1,保存中间元素下标
③ 中间元素 = 目标数 → 左区间 = 中间元素 + 1
代码:
int left=0, right=len-1;
int pos = -1;
while(left <= right)
{
int mid = left + (right-left)/2;
if(nums[mid] > target)
right = mid-1;
else if(nums[mid] < target)
left = mid+1;
else
{
pos = mid;
right = mid-1;
}
}
return pos;
非递减序列(有重复的递增序列)找最后一个=target的下标(上边界)
思路:
- 初始化
初始化下标pos = -1(不存在该元素) - 区间[left, right] = [0, len-1]
① 中间元素 > 目标数 → 右区间 = 中间元素 - 1
② 中间元素 < 目标数 → 左区间 = 中间元素 + 1
③ 中间元素 = 目标数 → 左区间 = 中间元素 + 1,保存中间元素下标
代码:
int left = 0, right = len-1;
int pos = -1;
while(left <= right)
{
int mid = left + (right-left)/2;
if(nums[mid] > target)
{
right = mid-1;
}
else if (nums[mid] < target)
left = mid+1;
else
{
pos = mid;
left = mid + 1;
}
}
return pos;