代码拉取完成,页面将自动刷新
同步操作将从 光花梗虎耳草/leetcode 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
二分的本质并非“单调性”,而是“边界”,只要找到某种性质,使得整个区间一分为二,那么就可以用二分把边界点二分出来。
boolean check(int x) {}
int search(int left, int right) {
while (left < right) {
int mid = (left + right) >> 1;
if (check(mid)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
boolean check(int x) {}
int search(int left, int right) {
while (left < right) {
int mid = (left + right + 1) >> 1;
if (check(mid)) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
我们做二分题目时,可以按照以下步骤:
while (left < right)
,注意是 left < right
,而非 left <= right
;mid = (left + right) >> 1
;check()
函数(有时很简单的逻辑,可以不定义 check
),想一下究竟要用 right = mid
(模板 1) 还是 left = mid
(模板 2);
right = mid
,那么无脑写出 else 语句 left = mid + 1
,并且不需要更改 mid 的计算,即保持 mid = (left + right) >> 1
;left = mid
,那么无脑写出 else 语句 right = mid - 1
,并且在 mid 计算时补充 +1,即 mid = (left + right + 1) >> 1
。注意,这两个模板的优点是始终保持答案位于二分区间内,二分结束条件对应的值恰好在答案所处的位置。 对于可能无解的情况,只要判断二分结束后的 left 或者 right 是否满足题意即可。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。