首页 > 其他分享 >2943. 最大化网格图中正方形空洞的面积

2943. 最大化网格图中正方形空洞的面积

时间:2023-11-27 16:55:59浏览次数:29  
标签:last int res 网格 正方形 vector prices return 2943

 简单模拟即可:

class Solution {
public:
    vector<int> findWordsContaining(vector<string>& words, char x) {
        int n = words.size();
        vector<int> res;
        for(int i = 0; i < n; i ++ ) {
            auto &word = words[i];
            for(auto ch: word) {
                if(ch == x) {
                    res.push_back(i);
                    break;
                }
            }
        }

        return res;
    }
};

 

 

 找规律, 最长连续子序列

class Solution {
public:
    int maximizeSquareHoleArea(int n, int m, vector<int>& hBars, vector<int>& vBars) {
        int res = 0;

        int lh = hBars.size(), lv = vBars.size();
        sort(hBars.begin(), hBars.end());
        sort(vBars.begin(), vBars.end());

        vector<int> f(lh, 1);
        vector<int> g(lv, 1);

        for(int i = 1; i < lh; i ++ ) {
            if(hBars[i] == hBars[i - 1] + 1) {
                f[i] = f[i - 1] + 1;
            }
        }

        for(int i = 1; i <lv; i ++ ) {
            if(vBars[i] == vBars[i - 1] + 1) {
                g[i] = g[i - 1] + 1;
            }
        }

        int vlen = 0, hlen = 0;
        for(int i = 0; i < lh; i ++ ) {
            if(hBars[i] != n + 2) vlen = max(vlen, f[i]);
            else vlen = max(vlen, f[i] - 1);
        }

        for(int i = 0; i < lv; i ++ ) {
            if(vBars[i] != m + 2) hlen = max(hlen, g[i]);
            else hlen = max(hlen, g[i] - 1);
        }

        cout << vlen << ' ' << hlen << endl;
        int lim = min(vlen, hlen);

        return (lim + 1) * (lim + 1);
    }
};

 

 递归搜索 -> 递推 -> 单调队列优化dp

class Solution:
    def minimumCoins(self, prices: List[int]) -> int:
        n = len(prices)

        @cache
        def dfs(i: int) -> int:
            if i > n:
                return 0
            res = inf
            for j in range(i + 1, i * 2 + 2):
                res = min(res, dfs(j))
            
            return res + prices[i - 1]

        return dfs(1)

 

class Solution:
    def minimumCoins(self, prices: List[int]) -> int:
        n = len(prices)
        f = [0] * (n + 1)

        for i in range(n, 0, -1):
            if i * 2 >= n:
                f[i] = prices[i - 1]
            else:
                f[i] = min(f[i + 1: i * 2 + 2]) + prices[i - 1]

        return f[1]
            

 

class Solution:
    def minimumCoins(self, prices: List[int]) -> int:
        n = len(prices)
        q = deque([(n + 1, 0)])

        for i in range(n, 0, -1):
            while q[-1][0] > 2 * i + 1:
                q.pop()
            
            f = q[-1][1] + prices[i - 1]

            while f <= q[0][1]:
                q.popleft()
            q.appendleft((i, f))

        return q[0][1]

 

 

 

单调队列优化dp

f[i] 表示以第i个位置为结尾,操作前i个数字所得到的最大非递减子数组长度

f[i] = f[j] + 1 // f[i] 铁定递增

last[i] 表示这个操作后,最后一个数字最小,有一个小小的贪心,在f[i]尽量大的情况下,last[i]尽量小

s[i] 表示 nums 的前缀和, s[i] - s[j] 表示从j + 1 到 i的元素和

要满足 s[i] - s[j] >= last[j] 才可以转移

 

转移条件

s[i] - s[j] >= last[j] -> s[i] >= s[j] + last[j]

f[i] = f[j] + 1

 

对于两个下标j < k & f[j] < f[k]

s[j] + last[j] < s[k] + last[k] <= s[i]

我们一定是要k这个点对应的数据, 都可以满足条件的情况下,取最大的

 

单调队列优化核心: 剔除无用数据

三部曲:

队首出队条件 (转移之前剔除)

s[j] + last[j] < s[k] + last[k] <= s[i]

队首的第二个下标s[idx] + last[idx] <= s[i] 这时候可以去掉队首

 

转移

f[i] = f[q[0]] + 1

last[i] = s[i] - s[q[0]]

 

队尾入队条件 (转移之后剔除)

s[j] + last[j] < s[k] + last[k] <= s[i]

右边的更大,就可以去掉队尾

 

class Solution:
    def findMaximumLength(self, nums: List[int]) -> int:
        n = len(nums)
        s = list(accumulate(nums, initial=0))
        f = [0] * (n + 1)
        last = [0] * (n + 1)
        q = deque([0])

        for i in range(1, n + 1):
            while len(q) > 1 and s[q[1]] + last[q[1]] <= s[i]:
                q.popleft()
            
            f[i] = f[q[0]] + 1
            last[i] = s[i] - s[q[0]]

            while q and s[q[-1]] + last[q[-1]] >= s[i] + last[i]:
                q.pop()
            q.append(i)

        return f[n]

 

标签:last,int,res,网格,正方形,vector,prices,return,2943
From: https://www.cnblogs.com/zk6696/p/17859758.html

相关文章

  • 一种解决A*Pathfindings使用RichAI寻路 跌落出导航网格的方法
    A*Pathfinding是Unity中一个比较常用的寻路插件,其主要功能是绘制导航图并让物体沿着导航图向目标移动,可结合多种方法进行寻路方式的扩展。 该插件付费的Pro版拥有一个通过投影方式获得场景中所有网格(mesh),在网格(mesh)标面自动生成导航网格的功能,称为RecastGraph,同时配合用于A......
  • 【题目-理想的正方形】 二维单调队列
    理想的正方形(二维单调队列)题目acwing.1091理想的正方形题解题目很好做,主要学习一下二维单调队列的写法首先将每行各窗口内最值用单调队列维护出来,保存在rmax中接着对rmax各列,将每列最值用单调队列维护出来,保存在cmax中,最后cmax中存的就是行和列窗口乘积范围的二维区间......
  • 【231119-1】如图,在正方形ABCD中,以AB为腰向正方形内部作等腰三角线ABE,点G在CD上,且CG=3
    【题目】如图,在正方形ABCD中,以AB为腰向正方形内部作等腰三角线ABE,点G在CD上,且CG=3DG,链接BG并延长,与AE交于F,与AD延长线交于H。连接DE交BH于点K,连接CK。若AE^2=BFBH,FG=13/5根号5.求:四边形EFKC的面积?【解答】......
  • echarts坐标轴线、坐标轴刻度线、网格线控制
    xAxis:{name:'',axisTick:{show:true//坐标轴刻度线},axisLine:{//轴线show:false},splitLine:{//网格线show:true},axisLabel:{//坐标轴样式textStyle:{color:'#636363'}}}参考文章echarts坐......
  • 2023-11-18:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像, 那
    2023-11-18:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像,那么称这个正方形矩阵叫做神奇矩阵。比如:1551633663361551这个正方形矩阵就是神奇矩阵。给定一个大矩阵n*m,返回其中神奇矩阵的数目。1<=n,m<=1000。来自左程云。答案2023-11-18:go,c......
  • 2023-11-18:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像, 那
    2023-11-18:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像,那么称这个正方形矩阵叫做神奇矩阵。比如:1551633663361551这个正方形矩阵就是神奇矩阵。给定一个大矩阵n*m,返回其中神奇矩阵的数目。1<=n,m<=1000。来自左程云。答案2......
  • echarts修改图例legend样式:正方形、矩形、圆形、圆角
    ECharts提供的标记类型有'circle','rect','roundRect','triangle','diamond','pin','arrow','none'legend:{icon:'circle'}参考文章echarts图例修改legend中icon的形状及大小......
  • 7、Flutter GridView网格布局组件
    GridView创建网格列表主要有下面三种方式1、可以通过GridView.count实现网格布局   一行的Widget数量classHomePageextendsStatelessWidget{constHomePage({Key?key}):super(key:key);List<Widget>_getListData(){List<Widget>list=[];for(vari......
  • matplotlib网格坐标刻度
    matplotlib网格坐标刻度目录matplotlib网格坐标刻度概要网格设置坐标轴坐标轴范围双坐标轴反转坐标轴坐标轴的位置刻度主次刻度颜色大小角度样式刻度标签文本刻度密度中文乱码处理参考资料概要plt.title()#标题plt.grid() #网格plt.xlabel()#坐标说明plt.......
  • k8s-服务网格实战-配置 Mesh(灰度发布)
    在上一篇k8s-服务网格实战-入门Istio中分享了如何安装部署Istio,同时可以利用Istio实现gRPC的负载均衡。今天我们更进一步,深入了解使用Istio的功能。从Istio的流量模型中可以看出:Istio支持管理集群的出入口请求(gateway),同时也支持管理集群内的mesh流量,也就是集群内......