二分
1
哆啦c梦~~
嵌入式开发小白
展开
-
AcWing 15. 二维数组中的查找(二维数组中的二分查找)
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 样例 输入数组: [ [1,2,8,9], [2,4,9,12], [4,7,10,13], [6,8,11,15] ] 如果输入查找数值为7,则返回true, 如果输入查找数值为5,则返回false。 题解 核心在于发现每个子矩阵右上角的数的性质: 如下图所示,x左边的数都小于等于x,x下边的数都大于等于x。 因此我们可转载 2020-10-18 16:52:58 · 196 阅读 · 0 评论 -
AcWing 14. 不修改数组找出重复的数字
题目描述 给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。 请找出数组中任意一个重复的数,但不能修改输入的数组。 样例 给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。 返回 2 或 3。 思考题:如果只能使用 O(1) 的额外空间,该怎么做呢? 题解 抽屉原理:n+1 个苹果放在 n 个抽屉里,那么至少有一个抽屉中会放两个苹果。 按数的取值范围将区间[1, n]划分成[1, n/2]和[n/2+1, n]两个子区间,然后分别统计两个区原创 2020-10-18 16:33:20 · 140 阅读 · 0 评论 -
二分查找 + AcWing 1236. 递增三元组
模板 bool check(int x) {/* ... */} // 检查x是否满足某种性质 // 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用: int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; // check()判断mid是否满足性质 else l原创 2020-10-15 11:40:35 · 159 阅读 · 0 评论