
二分法
二分法
__anonymous_
Stay hungry, stay foolish.
展开
-
AcWing 1236. 递增三元组 (flag + 前缀和 | 二分 | 滑动窗口)
1236. 递增三元组 解题思路 最开始想到3重循环枚举三个数组,然后最内层用条件语句判断一下即可,但是数据范围为10510^5105,三重循环肯定会超时 那么这道题很可能需要的算法复杂度为O(n)O(n)O(n)或O(nlogn)O(nlogn)O(nlogn),所以只能枚举一个数组,那么枚举哪一个呢? 根据题目来看,要求Ai<Bj<CkA_i<B_j<C_kAi<Bj<Ck,那么就来枚举B数组 此时我们只需要找到A数组中所有小于BjB_jBj的数和C数组中所原创 2020-10-25 15:35:10 · 324 阅读 · 0 评论 -
AcWing 730. 机器人跳跃问题 (二分)
AcWing 730. 机器人跳跃问题 思路: 由题意可以推出从当前位置跳到下一个位置时,下一个位置的能量值一定为: 2∗E当前−H下一位置2*E_{当前}-H_{下一位置}2∗E当前−H下一位置 由简单的数学归纳可以知道,当 E0E_0E0 满足题意的最小初始能量时,任何大于 E0E_0E0 的初始能量也满足题意,任何小于 E0E_0E0 的初始能量就不再满足题意了 从上面的结论可以看出具有二段性,其中二段性的分界点即为满足题意的最小初始能量 E0E_0E0,因此该题可以用二分法 二段性:左原创 2020-10-11 14:44:18 · 236 阅读 · 0 评论 -
在有空字符串的有序字符串数组中查找(二分)
题意: 给定一个按照字典顺序排序的字符串数组 随意向数组中添加空串"" 查找字符串数组的非空串字符串返回其下标,不存在则返回-1 思路: 看见有序,可以考虑用二分法 但是数组中有空串,mid指向的元素可能会空串,此时让mid++,直到mid指向的不为空串 如果mid超过了right边界,说明最开始的mid到right这个范围内全为空串,此时让right收缩到最开始的mid - 1处即可 以上为特殊处理,后面使用常规的二分法即可 class Solution { public static i原创 2020-09-06 17:03:39 · 323 阅读 · 0 评论 -
LeetCode 154. 寻找旋转排序数组中的最小值 II (二分)
154. 寻找旋转排序数组中的最小值 II 题意 给定一个包含重复元素的升序旋转数组 找出旋转数组的最小值 二分法 class Solution { public int findMin(int[] nums) { int left = 0; int right = nums.length - 1; while (left < right) { int mid = left + ((right - left) &g原创 2020-09-05 15:46:36 · 129 阅读 · 0 评论 -
AcWing 789. 数的范围 (整数二分)
AcWing 789. 数的范围 题意: 给定一个升序数组 输入一个数 输出这个数第一次出现的下标和最后一次出现的下标 如果这个数不存在则输出-1 -1 思路: 用两次二分法 第一次用来找到key出现的第一个位置 第二次用来找到key出现的最后一个位置 import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { Scanner s =原创 2020-09-05 08:47:41 · 401 阅读 · 0 评论 -
LeetCode 153. 寻找旋转排序数组中的最小值(二分)
153. 寻找旋转排序数组中的最小值 class Solution { public static int findMin(int[] nums) { int left = 0; int right = nums.length - 1; while (left < right) { int mid = left + ((right - left) >> 1);原创 2020-09-05 10:22:31 · 143 阅读 · 0 评论