二分
Lzed
我好菜啊
展开
-
LA3971-Assemble(贪心+二分)
题目链接:http://acm.hust.edu.cn/vjudge/problem/13338思路:使最小值最大,只需要对目标进行二分,并且judge一下是否合法,在judge函数里面,用贪心思想,对于满足条件的,选择价值最低的代码#include <iostream>#include <cstring>#include <stack>#include <vector>#include <原创 2016-08-16 10:20:00 · 213 阅读 · 0 评论 -
Leetcode 209 - Minimum Size Subarray Sum(二分 or 双指针)
题意给一个数组a[]和一个数s,要求在a里面找到一个长度最短的连续子序列,并且子序列的和大于等于s。思路算法1前缀和 + 二分。时间复杂度O(nlogn)O(nlogn)。我们先维护一个前缀和ss,然后遍历ss里面的元素ss[i],那么我们另一个需要的前缀和ssjss_j应该满足ssj≤ssi−sss_j \leq ss_i - s。于是我们二分查找一下满足条件的ssjss_j即可。算法2双指针。时原创 2017-02-12 20:35:57 · 266 阅读 · 0 评论 -
Leetcode 222 - ount Complete Tree Nodes(二分 + 完全二叉树)
题意给一个完全二叉树,求节点数目。思路首先,假设完全二叉树的深度为h,那么0到h - 1都是满的,只有h不一定是满的。算法1我们只需要知道最后一层的最后一个不是NULL的节点是哪一个就可以了。我们假设最后一层的所以节点编号为[0,2n−1](n=h−1)[0, 2^n - 1] \quad(n = h - 1)。那么我们二分一下最后一层最后一个非NULL节点就好了。然后去判断这个节点是否存在。在判断原创 2017-02-13 14:28:21 · 202 阅读 · 0 评论 -
Leetcode 483 - Smallest Good Base(二分+枚举)
题意给一个数n,让我们确定一个n的进制base,使n在base的表示下是全1。即13在进制为3的表示111。思路我们假设x在进制为a的表示下为n个1,即x=a0+a1+a2+...+an−1x = a^0 + a^1 + a^2 + ... + a^{n - 1}。由于x不超过101810^18,即x最大为64位。于是n最大为64。即我们可以考虑一下枚举n。在n确定的情况下,我们可以二分一下a,如果原创 2017-02-13 15:19:55 · 367 阅读 · 0 评论 -
Leetcode 33 - Search in Rotated Sorted Array(二分)
题意给一个有序数组,然后从数组的某一个位置,将前后两半交换。现在给一个数k,求k在数组中出现的位置,如果没有出现,返回-1。思路算法1画个图,其实就两种情况:前半段长还是后半段长,然后分若干种情况去讨论。讨论结果如下:k>amk > a_m: am>ar:righta_m > a_r: rightam<ar:a_m < a_r: k<ar:rightk < a_r: rightk>ar原创 2017-02-13 16:44:33 · 235 阅读 · 0 评论 -
Leetcode 81 - Search in Rotated Sorted Array II(二分)
题意同Search in Rotated Sorted Array,只是数组中会有重复元素的出现。思路我们可以分析一下为什么和上一道题不同。假设我们的原来的数组为:1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 5现在我们在某一处交换成为:4, 4, 4, 4, 4, 4, 5, 1, 2, 3, 4。现在我们am=4,ar=4a_m = 4, a_r = 4,并没有能力去判断右边是否是原创 2017-02-13 17:01:04 · 183 阅读 · 0 评论 -
Leetcode 29 - Divide Two Integers(二进制分解)
题意在不使用%*/的情况下, 求int x / int y思路假设x/y=zx / y = z。最先想的是二分一下z的多少,但是我们考虑到在judge的时候,不能使用乘法,于是这个想法基本可以排除。我们想一下在小学的时候算除法的过程:即用被除数一直去减除数直到不够减。那么我们能否考虑:假设我们这次减1个,下次减2个,下次减4个呢,即我们将每次减的数翻倍。其实就是一个二进制分解的过程。现在,假设我们要原创 2017-02-13 19:51:58 · 183 阅读 · 0 评论 -
Leetcode 363 - Max Sum of Rectangle No Larger Than K(前缀和+二分)
题意给一个矩阵,求矩阵内最大的和,并且该和不超过k。思路我们先考虑求最大子矩形和。 时间复杂度是O(n3)O(n^3)的。其基本思路就是降维。我们枚举L和R,分别代表起始列和终止列的起点和终点,这是O(n2)O(n^2)的,然后降维后,转化成了一个一维数组,求一维数组的最大区间和即可。时间复杂度O(n)O(n)。所以求最大子矩阵的面积是O(n3)O(n^3)的。然后对于这道题,我们可以用相同的思路原创 2017-02-14 18:12:18 · 281 阅读 · 0 评论 -
Leetcode 4 - Median of Two Sorted Arrays(二分)
题意两个有序数组,求它们的中位数。思路其实我们可以将这个问题转化为:求两个有序数组的第k大。算法1非递归版。首先,我们假设在第一个数组里面任意找一个元素aia_i,那么它在第一个数组里是i+1i + 1大,如果我们知道它在第二个数组内是j大,那么在两个数组合成以后,它就是i+j+1i + j +1大了。那么我们如何判断它在第二个数组内是第几大呢?因为第二个数组是有序的,所以我们只需要二分查找一下它的原创 2017-02-14 21:10:27 · 167 阅读 · 0 评论 -
Leetcode 215 - Kth Largest Element in an Array(二分)
题意求一个未排序数组的第k大。思路算法1O(nlogn)O(nlogn)的复杂度。先排序,然后直接返回第k大即可。算法2期望时间为O(n)O(n),最坏时间为O(n2)O(n^2)的算法。其基本思想就是基于快排。首先,我们选择一个观察哨x,将≥x\geq x的元素放在x左边,小于x的元素放在x的右边。然后,如果x此时的位置pos+1==kpos + 1 == k,说明x即为我们要求的元素。否则, 如原创 2017-02-15 20:29:04 · 183 阅读 · 0 评论 -
Leetcode 410 - Split Array Largest Sum(dp or 二分答案)
题意给定一个数组,将数组划分m组,要求每组的和的最大值最小思路算法1:dp首先我们这样考虑:我们要将前n个元素划分成m段,即先找一个划分点k,在[k + 1, n]不再划分。然后将[1, k]划分成m - 1段。那么就可以得到我们的状态表示和转移方程。状态表示:d[i,j]d[i, j],前i个元素,划分成j段的最大和。 转移方程:d[i,j]=min{max0≤k<i{d[k,j−1]},∑p=原创 2017-02-03 19:20:37 · 385 阅读 · 0 评论 -
hihocoder 1269 - 优化延迟(二分 + heap)
题目连接https://hihocoder.com/problemset/problem/1269思路二分缓冲区的大小,在判断答案是否合法的时候,用堆去维护。代码#include <bits/stdc++.h>using namespace std;#define LL long longconst int maxn = 100000 + 5;LL N, Q;LL p[maxn];bool j原创 2017-04-11 20:43:30 · 228 阅读 · 0 评论 -
Leetcode 475 -Heaters(二分 or 贪心)
题意在x轴上给定一堆房子和一些加热器,所有加热器的覆盖半径相同。求最小覆盖半径。思路算法1先排序,然后二分加热器的半径。最后判断是否合法。时间复杂度:O(nlog(INT_MAX))O(nlog(INT\_MAX))算法2先排序,然后O(n)O(n)的去扫一遍。时间复杂度:O(nlog(n))O(nlog(n))我们对于一个房子x,假设它之前的一个房子的加热器是y。那么x的选择为:y, y + 1,原创 2017-02-12 19:23:38 · 278 阅读 · 0 评论 -
Leetcode 34 - search for a Range(二分)
题意给定一个有序数组a[],和一个目标数字target,求target在a[]中出现的范围。思路最先想用lower_bound和upper_bound随便搞一样,但是想了一样既然在学二分就好好写二分吧。其实这个题里面两个二分的区别就在于取等号的不同。细节当a[m] = target的时候不能直接返回,因为我们要找的是最边界的那两个点。代码class Solution {public: in原创 2017-02-12 18:35:59 · 212 阅读 · 0 评论 -
Leetcode 162 - Find Peak Element(二分)
题意给定一个数组,找任意一个极大值。思路算法1暴力用vector维护一个单调减的序列。最后返回第一个元素就好。算法2首先,只有一个元素的时候我们特判一下。然后我们在求极值点的时候,假设当前位置在m,那么我们需要和m - 1以及m + 1的位置上的数进行比较。于是自然就需要考虑一下0和n - 1的边界情况。对于n - 1的边界情况,我们可以在vector的最后push一个INT_MIN。然后对于0的情原创 2017-02-12 17:25:46 · 207 阅读 · 0 评论 -
HDU5875-Function(RMQ + 二分)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5875思路对于一个数a % b,只有当b ≤ a的时候,a才会变化 因此对于每个询问[L, R],只需要找到第一个≤a[L]的即可,先用ST表预处理出区间[L, R]的最小值,然后二分查询区间内满足条件的值代码#include <iostream>#include <cstring>#include原创 2016-09-19 16:37:21 · 208 阅读 · 0 评论 -
Codeforces722D-Generating Sets(set + 二分答案)
题目链接http://codeforces.com/contest/722/problem/D思路最大值最小问题,显然二分 二分一下最大值的大小,然后每次去judge judge的思路:设上限为y,对于一个元素x,首先缩小到x≤yx \leq y,然后如果集合里面已经存在x了,那么x=x/2x = x / 2,直到能够插入x细节答案是在judge函数里面插入的,二分的时候如果judge(L) M原创 2016-10-06 20:33:17 · 269 阅读 · 0 评论 -
Codeforces750C-New Year and Rating(二分+模拟)
题目链接http://codeforces.com/contest/750/problem/C思路二分初始分数x,对初始分数x进行合法性判断即可 注意边界条件的判断,以及当时二分边界写跪了被hack了。。二分左端点可以是负值代码#include <bits/stdc++.h>using namespace std;inline int in() {int x; scanf("%d", &x); r原创 2016-12-31 14:05:29 · 428 阅读 · 0 评论 -
Leetcode 174 - Dungeon Game(二分+dp)
题意一个2D迷宫,公主在(m, n)的位置,骑士在(0, 0)的位置,并且有一个初始生命值。现在骑士要去(m, n)的位置,只能向右或者向上走。每个格子的位置上,都有BUFF和DEBUFF,现在要保持骑士在任何时刻的生命值都要大于0,求骑士的初始状态的最小生命值。思路算法1二分+dp。这是一个比较直观的思路,我们二分一下骑士初始的生命值,然后dp去判断是否合法。状态表示:d[i,j]d[i, j],原创 2017-02-09 23:12:23 · 260 阅读 · 0 评论 -
Leetcode287 - Find the Duplicate Number(二分)
题意将1到n之间的一些数放到n + 1大的数组中,求出那个重复出现的元素(题目保证只有一个元素重复出现,但可能出现若干次)。并且要求: 1. 额外空间为O(1)O(1)。 2. 时间复杂度小于O(n2)O(n^2)。 3. 数组是只读的,因此不能改变思路首先,时间复杂度小于O(logn)O(logn),那么我们自然能够想到是二分。可是二分什么呢?因为所有数均在1到n之间,假设有一个数重复出现,原创 2017-01-19 23:09:14 · 187 阅读 · 0 评论 -
Leetcode 454 - 4Sum II(hash)
题意给4个长度相同的数组,在每个数组里面选一个数,使它们的和加起来为0。问一共有多少方案?思路最先想的是O(n3logn)O(n^3logn)的。就ABC枚举一下,D二分一下。但是,我们可以考虑:先将AB的所有和n2n^2枚举一下放到一个新数组a里面,CD的和n2n^2加入到unordered_map里面,然后遍历a里面的元素,去unordered_map里面O(1)O(1)查找一下就好了。时间复杂原创 2017-02-10 23:35:59 · 201 阅读 · 0 评论 -
Leetcode 436 - Find Right Interval(排序+二分)
给定一堆区间,对于每一个区间,找出左端点≥\geq这个区间的右端点的一个区间(并且左端点尽量小)。思路给区间起点排序,然后对每一个区间,我们二分查找一下满足条件的区间即可。代码/** * Definition for an interval. * struct Interval { int start; int end; Interval() : sta原创 2017-02-11 18:42:49 · 285 阅读 · 0 评论 -
Leetcode 240 - Search a 2D Matrix II
题意求杨氏矩阵内数x是否存在。思路我们将右上角的数设置为起点。若x=a[i,j]:returnx = a[i,j]: return 若x>a[i,j]:i++x > a[i, j]: i++若x<a[i,j]:j−−x < a[i, j]: j--代码class Solution {public: bool searchMatrix(vector<vector<int>>& matri原创 2017-02-11 19:11:36 · 208 阅读 · 0 评论 -
Leetcode 378 - Kth Smallest Element in a Sorted Matrix(二分+杨氏矩阵)
题意求杨氏矩阵内的第k大元素。思路我们首先二分一下第k大元素,假设为x。然后只需要求x在杨氏矩阵内的排名就好(有多少个元素比x小)。求元素x在杨氏矩阵内的排名,时间复杂度O(m+n)O(m + n):初始order = 0, 从右上角a[i,j]a[i, j]开始。若x≥a[i,j]:i++,order+=j+1x \geq a[i, j]: i++, order += j + 1(加上这一行所原创 2017-02-11 19:12:41 · 354 阅读 · 0 评论 -
Leetcode 74 - Search a 2D Matrix(二分)
题意给一个每行均有序的矩阵,并且上一行的最后一个元素的值小于下一行第一个元素的值。求元素x是否在矩阵中。思路算法1两次二分查找,我们先将第一列的数拿出来放到数组b里面。对于我们每次要查找的元素x,我们在数组b里面二分一下所在行。然后去那一行二分查找。时间复杂度:O(logm⋅logn)O(logm \cdot logn)细节:矩阵为空。矩阵有若干行,但是每行都空。我们查找元素所在行的时候,会有原创 2017-02-11 19:45:59 · 184 阅读 · 0 评论 -
Leetcode 153 - Find Minimum in Rotated Sorted Array(二分)
题意一个有序数组,现在从中间一个位置,将这个位置的前后两半交换。并且不知道是从哪个位置交换的。问这个数组的最小值。思路我们交换两截后,这个数组变成了这个样子:然后我们去二分一下中间位置: 这时候,我们可以观察得到:如果a[m]<a[r]a[m] < a[r]:右边数组一定是升序的, 并且结果不在[m + 1, r]中,应该在[l, r]中。a[m]>=a[r]a[m] >= a[r]:结果应该原创 2017-02-11 20:36:09 · 242 阅读 · 0 评论 -
Codeforces 803D - Magazine Ad(二分)
题目链接http://codeforces.com/contest/803/problem/D题意字符串分成最大k行,使最大的那一行长度尽量小。 划分要求:空格或者-思路二分 二分一下每行最大多长,然后判断即可。代码#include <bits/stdc++.h>using namespace std;inline int in() {int x; scanf("%d", &x); return原创 2017-05-04 00:08:08 · 307 阅读 · 0 评论