题目描述与示例
题目描述
小朋友出操,按学号从小到大排成一列;小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。
算法复杂度要求不高于 nlog(n)
;学号为整数类型,队列规模 <= 10000
;
输入描述
- 第一行:输入已排成队列的小朋友的学号(正整数),以
","
隔开;例如:93,95,97,100,102,123,155
- 第二行:小明学号,如
110
;
输出描述
输出一个数字,代表队列位置(从 1
开始)。
示例
输入
93,95,97,100,102,123,155
110
输出
6
解题思路
注意,本题和LeetCode35. 搜索插入位置几乎完全一致,属于有序数组的二分板子题,没有任何难度。
PS:如果忘了二分怎么写,在本题的数据范围下,O(n)
复杂度的直接从头到尾遍历也是可以通过的。
代码
Python
# 题目:【二分查找】2023C-小明找位置
# 分值:100
# 作者:许老师-闭着眼睛学数理化
# 算法:二分查找
# 代码看不懂的地方,请直接在群上提问
# 相关题目:LeetCode35.搜索插入位置
nums = list(map(int, input().split(",")))
target = int(input())
# 左开右闭区间
left, right = 0, len(nums)
while left < right:
# 找到第一个大于等于target的位置
# 因为学号是唯一存在的,因此此处写成 > 也没有问题
mid = left + (right - left) // 2
if nums[mid] >= target:
right = mid
else:
left = mid + 1
# 输出的结果是left+1
# 这是因为队列编号是从1开始的
print(left + 1)
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] numsStr = scanner.nextLine().split(",");
int[] nums = new int[numsStr.length];
for (int i = 0; i < numsStr.length; i++) {
nums[i] = Integer.parseInt(numsStr[i]);
}
int target = scanner.nextInt();
int left = 0, right = nums.length;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] >= target) {
right = mid;
} else {
left = mid + 1;
}
}
System.out.println(left + 1);
}
}
C++
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main() {
string input;
getline(cin, input);
vector<int> nums;
int i = 0, pos;
while ((pos = input.find(",", i)) != string::npos) {
nums.push_back(stoi(input.substr(i, pos - i)));
i = pos + 1;
}
nums.push_back(stoi(input.substr(i)));
int target;
cin >> target;
int left = 0, right = nums.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] >= target) {
right = mid;
} else {
left = mid + 1;
}
}
cout << left + 1 << endl;
return 0;
}
时空复杂度
时间复杂度:O(log(N))
。二分查找的时间复杂度
空间复杂度:O(1)
。仅需若干常数变量。
华为OD算法/大厂面试高频题算法练习冲刺训练
-
华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
-
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
-
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
-
60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁
-
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
-
可查看链接 大厂真题汇总 & OD真题汇总(持续更新)
-
绿色聊天软件戳
od1336
了解更多