![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
分治
abant2
世界上最菜的arcem
展开
-
leetcode 240 单调矩阵搜索
此题和类似单调矩阵不太一样,每个小于target的行都有可能是。思路一:与普通矩阵类似,对每个小于target的行做二分查找class Solution {public: int bisect(vector<int> &v, int target) { int l = 0, r = v.size()-1; while(l<r) { int mid = ceil((l+r)/2.0);.原创 2021-07-28 14:04:27 · 143 阅读 · 0 评论 -
leetcode 87 字符串多次翻转 分治+区间dp
解法一(错误):分治开始的想法很朴素,先找到切分位置,然后切分后处理,其中,用素数存状态来判断是否一个分割位置合理。这种做法有个问题就是,一旦有一次切分错了,可能就回不来了,这个很致命。所以应该考虑每种切分情况,但这样是一定会超时的...原创 2021-04-16 15:33:31 · 248 阅读 · 0 评论 -
leetcode 493 满足大小关系的对 分治
注:此题与327题很相似。解法一:分治直接考虑,如果是两个有序数组,O(N)能不能做,用单指针明显可以,同327题。故直接分治解决。typedef long long ll;class Solution {public: void msort(vector<int>& nums, int& sum, int l, int r) { if(l == r)return; int mid = l + (r-l)/2;原创 2021-04-15 12:22:11 · 90 阅读 · 0 评论 -
leetcode 327 特殊分治 双指针 线段树
解法一:分治 O(NlogN)这个题用分治做其实很难想。对于求区间和问题,前缀数组很有用。但这个题要求所有区间范围,如果枚举需要O(N2)O(N^2)O(N2),其实也可以接受。用分治的话,其实就是想明白了一件事,只要确保i < j,i,j在哪个位置其实是不影响结果的,因为我们只需要求区间个数。这就很好办了,分治就是划分,然后处理两个有序数组。利用分治可以很容易得到所有上述数组,用O(N)时间计算区间个数+合并即可。在计算区间个数时,可以用到双指针。对第二个有序数组,咱们可以用双指针确定它的最小原创 2021-04-14 20:58:30 · 110 阅读 · 0 评论 -
topk问题终极解法 最坏O(N)
首先,按上图把数组分成很多个子数组,每个子数组有5个元素,分别排列,可以得到很多个按顺序排列的子数组。咱们找到这些数组中位数的中位数即为M,这个M是可以保证有相当一部分元素在其左边和右边,即对最坏选择点加了限制。之后就是常见的分治做法,交给子问题去做即可。下面为选择第k大的元素的代码:class Solution {public: int findKthLargest(vector<int>& nums, int k) { // 若少于5个,直接排序结束.原创 2021-04-09 14:37:56 · 248 阅读 · 0 评论 -
凸包问题 graham-scan 分治
本题参考数据来自 uva 11626解法一:贪心凸包问题上课讲了两种方法,其中第一种做法是按照极坐标排序+单调栈解决,这种做法比较容易理解。单调栈判断就是看新的点在直线左边还是右边,可以用叉乘的右手法则,即判断x1y2 - x2y1的符号。但有个问题就是当有多个点和初始点连成一条线时,这些点的极坐标顺序不好判断。这是一个很严重的问题,目前还未想到解决方案。此处暂时给出未解决这个问题版本的代码:#include <bits/stdc++.h>typedef long long ll;原创 2021-04-05 14:15:36 · 161 阅读 · 0 评论 -
最近点对问题 c++
最近点对的算法还是比较清楚的,在实际代码阶段要让效率达到最高,需要先对x排好序,递归过程中保证不再更改(因为x只用于分割这一步)。之后对y的排序要融合归并排序进去,即把元素分割到1个,这样保证排好序。之后在合并步骤只要合并两个排序好的数组,O(N)即可解决。#define _CRT_SECURE_NO_WARNINGS#include <cmath>#include <tuple>#include <cstdio>#include <vector>原创 2021-03-18 15:47:08 · 542 阅读 · 0 评论 -
leetcode 395 双指针X 分治✔
这题一看太像双指针了,熟悉的子区间问题,但这次不太一样。熟悉的双指针模板这里是不适用的。所以本题应该用分治做。关键的点在于,如果在字符串里有一个字符,他总数小于k,那么,任何包含这个字符的子串都不满足条件。所以,咱们应该把这个字符剔除出去,这个是核心。代码如下:class Solution: def longestSubstring(self, s: str, k: int) -> int: c0 = Counter(s) if len(s) == 0: r原创 2021-02-27 15:32:36 · 190 阅读 · 0 评论