LC二分
二分
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
LeetCode 1713 得到子序列的最少操作次数 (最长上升子序列(二分+贪心)、最长公共子序列)
LeetCode 1713class Solution {public: int minOperations(vector<int>& target, vector<int>& arr) { int n = target.size(); unordered_map<int,int> mp; for(int i = 0; i < n; i++) { mp[target[原创 2021-07-27 00:32:01 · 124 阅读 · 0 评论 -
LeetCode 1838. 最高频元素的频数 (排序 + 二分 | 滑窗)
1838. 最高频元素的频数排序+二分class Solution {public: int maxFrequency(vector<int>& nums, int k) { sort(nums.begin(),nums.end()); int ans = 1; int n = nums.size(); vector<long long> s(n); s[0] = nums[0]原创 2021-07-19 18:31:14 · 91 阅读 · 0 评论 -
LeetCode 363. 矩形区域不超过 K 的最大数值和 (二维前缀和)
363. 矩形区域不超过 K 的最大数值和时间复杂度: O(m2n2)O(m^2n^2)O(m2n2)const int N = 110;class Solution {public: int maxSumSubmatrix(vector<vector<int>>& matrix, int k) { int g[N][N]; int m = matrix.size(), n = matrix[0].size();原创 2021-04-24 16:09:54 · 140 阅读 · 0 评论 -
LeetCode 1631. 最小体力消耗路径 (二分+图连通性、迪杰斯特拉变形)
class Solution { boolean[][] vis; int[][] g; int[] dx = {0,1,0,-1}; int[] dy = {1,0,-1,0}; int m,n; public int minimumEffortPath(int[][] heights) { g = heights; int l = 0,r = (int)1e6; m = g.length;原创 2021-01-30 14:13:51 · 91 阅读 · 0 评论 -
LeetCode LCP 12. 小张刷题计划 (二分、贪心)
LCP 12. 小张刷题计划二分的判定函数为:判断为阈值为top的时候,他能否在m天内完成任务。具体做法,因为每一天都可以用一次求助机会,所以不用白不用。那么怎么用最划算呢?对于给定的区间,去掉这个区间的最大值之后,剩余的数求和要小于等于阈值,那么这段区间便可以在一天内完成(其实这也是具有两段性的,可以用二分优化。)class Solution {public: int m; int minTime(vector<int>& time, int m) {原创 2020-09-06 23:16:48 · 126 阅读 · 0 评论 -
LeetCode LCP 12. 小张刷题计划 (最小化最大值、二分)
LCP 12. 小张刷题计划最小化最大值问题的基本问题模型。如果说答案是T0T_0T0,那么他一定可以在T0+1、T0+2、……T_0+1、T_0+2、……T0+1、T0+2、……完成这个任务。反之,如果不行,那么他在T0−1、T0−2、……T_0-1、T_0-2、……T0−1、T0−2、……也都不可能完成。而这就满足了二分的两段性。具体判断时,要判断一个子区间如果去除掉其中的最大值之后能否小于一个阈值,如果超过,就花费了一天。class Solution {public:原创 2020-09-05 22:29:21 · 206 阅读 · 0 评论 -
LeetCode 911. 在线选举 (打表、二分)
在线选举先记录下每个时间段的“赢家”是谁,然后二分查找t属于哪个时间段。也就是查找times[i] <= t < times[i+1]。具体记录每个阶段的赢家的时候,先用int cnt[]记录每个候选者获得的票数,然后每一次投票之后更新此时的“赢家”即可。class TopVotedCandidate {public: int book[5010], cnt[5010] = {0}, len; vector<int> times; TopVoted原创 2020-08-22 15:21:15 · 170 阅读 · 0 评论 -
LeetCode 704. 二分查找 (二分查找)
704. 二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。class Solution {public: int search(vector<int>& nums, int target) { int n = nums.size(); int l = 0, r = n-1; while(l<原创 2020-08-08 16:55:05 · 85 阅读 · 0 评论 -
LeetCode 1292. 元素和小于等于阈值的正方形的最大边长 (二维前缀和+二分查找)
元素和小于等于阈值的正方形的最大边长class Solution {public: int getRect(const vector<vector<int>> &g,int x1,int y1,int x2,int y2){ return g[x2][y2]-g[x1-1][y2]-g[x2][y1-1]+g[x1-1][y1-1]; } int maxSideLength(vector<vector<int>&g原创 2020-08-08 16:52:01 · 140 阅读 · 0 评论 -
LeetCode 1044. 最长重复子串 (字符串hash+二分)
最长重复子串最暴力的方法:O(n3)O(n^3)O(n3)枚举每种长度、每个起始位置、再用O(n)的开销去检查是否有重复子串。优化1字符串hash预处理,省去O(n)的开销优化2枚举长度的时候明显具有单调性,二分处理。时间复杂度:O(n∗log(n))O(n*log(n))O(n∗log(n))这道题的做法也可以套用在最长回文子串上面typedef unsigned long long ull;class Solution {public: int P = 1e9+7 ,n原创 2020-08-06 18:54:37 · 260 阅读 · 0 评论 -
LeetCode 74. 搜索二维矩阵 (二维到一位数组的角标映射)
搜索二维矩阵先二分行、再二分列。class Solution {public: bool searchMatrix(vector<vector<int>>& a, int target) { if(a.size()==0 || a[0].size()==0) return false; int m = a.size(), n = a[0].size(); int l = 0,r = m-1 , res = -1;原创 2020-08-06 15:32:13 · 153 阅读 · 0 评论 -
LeetCode 274. H 指数 275. H指数 II(排序+二分、计数排序)
275. H指数 II排序、二分根据题给定义,可以发现这个过程明显具有单调性。排序过后,h指数将数组分成两段;左面一段都具有这样的特征:a[n−h−1]<=ha[n-h-1]<=ha[n−h−1]<=h右面一段都具有这样的特征:a[n−h−1]>ha[n-h-1]>ha[n−h−1]>h临界点就是h指数。class Solution {public: int hIndex(vector<int>& a) {原创 2020-08-06 14:12:24 · 118 阅读 · 0 评论 -
LeetCode 1482. 制作 m 束花所需的最少天数 (二分判定问题)
制作 m 束花所需的最少天数class Solution {public: int n; int minDays(vector<int>& a, int m, int k) { n = a.size(); if(n<m*k) return -1; int l = 1, r = 1e9; while(l<r){ int mid = l+(r-l)/2;原创 2020-08-06 12:18:05 · 85 阅读 · 0 评论 -
LeetCode 875. 爱吃香蕉的珂珂 (二分判定、很经典的二分模型)
爱吃香蕉的珂珂class Solution {public: int minEatingSpeed(vector<int>& piles, int H) { int l = 1, r = 1e9; while(l<r){ int m = l+(r-l)/2; if(isOk(piles,H,m)){ r = m; }else{原创 2020-08-05 20:10:33 · 152 阅读 · 0 评论 -
LeetCode 668. 乘法表中第k小的数 (与 378题一个做法)
乘法表中第k小的数O(log(m∗n)∗max(m,n))O(log(m*n)*max(m,n))O(log(m∗n)∗max(m,n))class Solution {public: int findKthNumber(int m, int n, int k) { int l = 1, r = m*n; while(l<r){ int mid = l+(r-l)/2; int res = bs(m,n,mi原创 2020-08-05 01:08:06 · 170 阅读 · 0 评论 -
LeetCode 面试题 10.09. 排序矩阵查找 (二分查找的思想、一次遍历)
面试题 10.09. 排序矩阵查找class Solution {public: bool searchMatrix(vector<vector<int>>& g, int target) { if(g.size()==0 || g[0].size()==0) return false; int m = g.size(), n = g[0].size(), i=0, j=n-1; while(i<m){原创 2020-08-05 00:29:47 · 104 阅读 · 0 评论 -
LeetCode 剑指 Offer 53 - II. 0~n-1中缺失的数字 (二分入门题)
剑指 Offer 53 - II. 0~n-1中缺失的数字缺失的数字前后分成了两段。class Solution {public: int missingNumber(vector<int>& a) { int l = 0 ,r = a.size(); while(l<r){ int m = l+(r-l)/2; if(a[m]==m){ l = m+1;原创 2020-08-04 21:49:10 · 74 阅读 · 0 评论 -
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 (二分经典入门题)
在排序数组中查找元素的第一个和最后一个位置class Solution {public: vector<int> searchRange(vector<int>& a, int target) { vector<int> ans; int l = 0 ,r = (int)a.size()-1; int ll=-1,rr=-1; while(l<=r){ int原创 2020-08-04 21:41:17 · 89 阅读 · 0 评论 -
LeetCode 436. 寻找右区间 (二分)
寻找右区间感觉题目交代的优点小问题。class Solution {public: vector<int> findRightInterval(vector<vector<int>>& intervals) { vector<int> ans; vector<pair<int,int>> v; int n = intervals.size();原创 2020-08-03 13:43:56 · 94 阅读 · 0 评论 -
LeetCode 1300. 转变数组后最接近目标值的数组和 (排序+双重二分+前缀和)
转变数组后最接近目标值的数组和由于选定一个数来转变数组之后产生的求和是具有单调性,所有可以二分解决,(这个过程有点像在实数域上二分求零点),然后考虑到每次求和可以用前缀和来优化,先用二分求出第一个大于这个值的下标,然后直接得出转变后的数组和。时间复杂度:O(n∗log(n)+log(C)∗log(n))O(n*log(n)+log(C)*log(n))O(n∗log(n)+log(C)∗log(n)),其中C是数组中的最大值。class Solution {public: int res原创 2020-08-03 13:20:39 · 138 阅读 · 0 评论 -
LeetCode 162. 寻找峰值 (二分、递归迭代实现)
寻找峰值思路:根据一个点处在上下坡,来缩小搜索区间。class Solution {public: int findPeakElement(vector<int>& a) { int n = a.size(); if(n==1) return 0; if(n==2) return a[0]>a[1]?0:1; int l = 0 ,r = (int)a.size()-1; while(l原创 2020-08-03 12:29:42 · 176 阅读 · 0 评论 -
LeetCode 1351. 统计有序矩阵中的负数 (二分、单调遍历)
统计有序矩阵中的负数时间复杂度:O(m∗log(n))O(m*log(n))O(m∗log(n))class Solution {public: int m,n, ans = 0; int countNegatives(vector<vector<int>>& g) { m = g.size(), n = g[0].size(); for(int i=0;i<m;i++){ ans +=原创 2020-08-01 18:46:37 · 77 阅读 · 0 评论 -
LeetCode 852. 山脉数组的峰顶索引 (二分)
山脉数组的峰顶索引class Solution {public: int peakIndexInMountainArray(vector<int>& a) { int l = 0, r = a.size()-1; while(l<=r){ int m = l+(r-l)/2; if(a[m]>a[m-1] && a[m]>a[m+1]){原创 2020-08-01 18:25:05 · 79 阅读 · 0 评论 -
LeetCode 1515. 服务中心的最佳位置 (三分套三分、三分法求凸函数极值)
服务中心的最佳位置这道题目可以使用三分法求凸函数极值解决,(否则就要用那些机器学习的算法去做)。但这道题目是二元函数,这个时候可以考虑偏导的含义,先控制一个变量不变,让另一个变量变化得出一个极值,几何意义上其实就是用x=xi,1<=i<=nx=x_i,1<=i<=nx=xi,1<=i<=n这n多个平面去切割这个三维曲面,然后对于这n多个函数分别让y变化用三分法求出对应的极值,这些极值点构成的曲线实际上仍然是凸函数,继续用三分法求解,通俗的讲,就是三分套三分。cla原创 2020-08-01 16:19:17 · 396 阅读 · 0 评论 -
LeetCode 209. 长度最小的子数组 (滑动窗口 || 前缀和+二分查找)
长度最小的子数组class Solution {public: int minSubArrayLen(int s, vector<int>& a) { int ans = 1e9,n = a.size(); int l = 0 ,r = 0 ,cnt = 0; while(l<n){ while(r<n && cnt<s){ cnt +=原创 2020-07-29 10:09:21 · 151 阅读 · 0 评论 -
LeetCode 154. 寻找旋转排序数组中的最小值 II (二分、边界条件)
寻找旋转排序数组中的最小值 II画个图脑补一下最坏时间复杂度:O(n)O(n)O(n)class Solution {public: int findMin(vector<int>& a) { int n = a.size(); int l = 0 , r = n-1; while(l<r){ //l==r时就终止了,最小值就已找到了 int m = l+(r-l)/2;原创 2020-07-22 05:01:35 · 75 阅读 · 0 评论 -
LeetCode 378. 有序矩阵中第K小的元素 (堆+多路归并、 二分(非常经典))
有序矩阵中第K小的元素class Solution {public: int n; int kthSmallest(vector<vector<int>>& a, int k) { n = a.size(); int l = a[0][0], r = a[n-1][n-1] , mid; int ans = 0; while(l<r){ mid = ((long原创 2020-07-13 20:30:36 · 163 阅读 · 0 评论 -
LeetCode 33. 搜索旋转排序数组 (二分查找经典入门题)
搜索旋转排序数组大的方面的思路:先找出分段点,然后在两段分别增序的数字中进行二分查找。class Solution {public: int search(vector<int>& a, int target) { int n = a.size(), l = 0 ,r = a.size()-1; if(n==0) return -1; //特判 while(l<r){ int mid = (l+原创 2020-07-13 17:48:41 · 87 阅读 · 0 评论 -
LeetCode 153. 寻找旋转排序数组中的最小值 (二分入门基础题)
寻找旋转排序数组中的最小值 因为数组被分成了两段,所以我们可以找出第一段的终点(找出最后一个大于a[0]a[0]a[0]的位置);也可以找出第二段的起点(找出第一个小于a[0]a[0]a[0]的位置)。思路一class Solution {public: int findMin(vector<int>& a) { int n = a.size() , maxIdx = -1; int l = 0 ,r = n-1; wh原创 2020-07-13 17:17:39 · 62 阅读 · 0 评论 -
LeetCode 778. 水位上升的泳池中游泳(DFS+二分)
这个题目,用搜索做是很正常的想法 ,于是我就这样交代码了;由于题给测试数据不大,200ms还是过了。时间复杂度:O(n4)O(n^4)O(n4)const int dx[] = {-1,0,1,0};const int dy[] = {0,1,0,-1};class Solution {public: int n,t; bool vis[51][51]; int swimInWater(vector<vector<int>>& grid)原创 2020-06-06 19:16:26 · 257 阅读 · 0 评论