本文主要是介绍[LeetCode][LCR173]点名——二分结合输入数据特点找边界,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
LCR 173. 点名
某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席,请返回他的学号。
- 示例 1:
输入:
records = [0,1,2,3,5]
输出:4
- 示例 2:
输入:
records = [0, 1, 2, 3, 4, 5, 6, 8]
输出:7
- 提示:
节点总数 <= 10000
解法:
- 由于有 n 位同学,学号为 0~n-1,如果将其放置于数组中,其数值下标应该和元素一一对应
- 如果有一位同学缺席,那么从这个同学的位置开始,数值下标和元素就不一一对应了
- 所以我们要找到这个边界,在边界的左侧数组下标与元素相等,在边界的右侧数组的下标与边界不相等,一般会联想到二分查找
- 当 middle 处下标与元素相等时,边界在 middle 的右边;当 middle 处下标与元素不相等,且 middle-1 处下标与元素相等时,middle 即为边界;其他情况说明边界在 middle 的左边
- 二分的具体写法可以参考《二分查找的梳理——边界初始值、循环条件、边界更新》
class Solution {
public:int takeAttendance(vector<int>& nums) {if(nums[0]!=0) return 0;int l=0, r=nums.size()-1;while(l<=r){int m=l+(r-l)/2;if(nums[m]==m) l=m+1;else if(nums[m]!=m && nums[m-1]==m-1){l=m;break;}else r=m-1;}return l;}
};
这篇关于[LeetCode][LCR173]点名——二分结合输入数据特点找边界的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!