首页 > 其他分享 >Leetcode 6207 -- dp/思维/双指针

Leetcode 6207 -- dp/思维/双指针

时间:2022-10-16 16:34:26浏览次数:80  
标签:nums -- minx 6207 maxn && var Leetcode dp

题目描述

max min

思路

思维代码

class Solution {
    func countSubarrays(_ nums: [Int], _ minK: Int, _ maxK: Int) -> Int {
        let segments = nums.split { $0 > maxK || $0 < minK}
        var ans = 0
        for s in segments {
            let seg = [Int](s)
            guard seg.contains(minK) && seg.contains(maxK) else {continue}
            let N = seg.count
            var latestMinKIdx = -1
            var latestMaxKIdx = -1

            for i in 0..<N {
                if seg[i] == minK {
                    latestMinKIdx = i
                }
                if seg[i] == maxK {
                    latestMaxKIdx = i
                }
                let necessaryIdx = min(latestMinKIdx, latestMaxKIdx)
                if necessaryIdx != -1 {
                    ans += necessaryIdx + 1
                }
            }
        }
        return ans
    }
}

class Solution {
    func countSubarrays(_ nums: [Int], _ minK: Int, _ maxK: Int) -> Int {
        var ans = 0
        var left = -1
        var latestMinKIdx = -1
        var latestMaxKIdx = -1
        let N = nums.count
        for i in 0..<N {
            if nums[i] == minK {
                latestMinKIdx = i
            }
            if nums[i] == maxK {
                latestMaxKIdx = i
            }
            if nums[i] >= minK && nums[i] <= maxK {
                let necessaryIdx = min(latestMinKIdx, latestMaxKIdx)
                if necessaryIdx != -1 {
                    ans += necessaryIdx - left
                }
            } else {
                latestMaxKIdx = -1
                latestMinKIdx = -1
                left = i
            }
        }
        return ans
    }
}

作者:RobinLiu
链接:https://leetcode.cn/problems/count-subarrays-with-fixed-bounds/solution/by-robinliu-0x9r/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

dp代码

class Solution {
public:
    long long countSubarrays(vector<int>& nums, int minx, int maxn) {
        /*
        以条件A表示最大值为maxn,条件B表示最小值为minx,设置dp[nums.length][4]数组
        dp[i][0/1/2/3]分别表示分别满足下面条件的子数组的个数:
            [0]: 以nums[i]为结尾的子数组中满足条件A&&B的, maxn, minx
            [1]: 只满足条件A的, maxn
            [2]: 只满足条件B的, minx
            [3]: 两个条件都不满足但没有超出[minx,maxn]范围的, null
        再一次遍历每次根据nums[i]和dp[i-1]确定dp[i]
        */
        int n = nums.size();
        long long res = 0;
        vector<vector<long long>> dp(n, vector<long long>(4));
        // 由于 nums[0] 前面没有元素无法dp,所以预处理nums[0]
        if(nums[0] == maxn && nums[0] == minx)  dp[0][0] = 1;
        else if(nums[0] == maxn)    dp[0][1] = 1;
        else if(nums[0] == minx)    dp[0][2] = 1;
        else if(nums[0] >= minx && nums[0] <= maxn) dp[0][3] = 1;
        res += dp[0][0];
        
        for(int i = 1; i < n; i ++ )
        {
            if(nums[i] == maxn && nums[i] == minx)  
            {
                dp[i][0] = 1 + dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][3];
            }
            else if(nums[i] == maxn)   
            {
                dp[i][1] = 1 + dp[i - 1][1] + dp[i - 1][3];
                dp[i][0] = dp[i - 1][2] + dp[i - 1][0];
            }
            else if(nums[i] == minx)
            {
                dp[i][2] = 1 + dp[i - 1][2] + dp[i - 1][3];
                dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
            }
            else if(nums[i] >= minx && nums[i] <= maxn)
            {
                dp[i][0] = dp[i - 1][0];
                dp[i][1] = dp[i - 1][1];
                dp[i][2] = dp[i - 1][2];
                dp[i][3] = 1 + dp[i - 1][3];
            }
            res += dp[i][0];
        }
        return res;
    }
};

借鉴

思维

dp,太牛了

codeforce

标签:nums,--,minx,6207,maxn,&&,var,Leetcode,dp
From: https://www.cnblogs.com/ALaterStart/p/16796458.html

相关文章

  • pip 命令批量安装python包
    1.PyPI:PythonPackageIndex,thedefaultrepository(仓库)ofPythonpackagesforPythoncommunitythatincludesframeworks,toolsand,libraries.    ......
  • getUserMedia()出现的常见错误
    在你的getUserMedia()开始运行的那一瞬间,就会遇到各种各样的错误:        1.用户没有摄像头,只有一个麦克风;或者麦克风/摄像头都没有        2.用户(不......
  • pinia - 为 antdv 表格添加加载状态
    前言我们之前制作的Vue3+AntDesignVue+SpringBoot的增删改查小Demo的功能已经全部实现了,但是还是有一点不完美,在发送请求到后端返回数据这一段时间内前台未做任......
  • CF1188C
    又一次错过了单杀*2500的机会,不知道该说什么了。。先把\(a\)排序,不会影响答案。考虑枚举答案\(v\),计算有多少种选择子序列的方法使得答案为\(v\)。这不太好做,考虑......
  • L - Session in BSU
    传送门题意:有n场考试,给出每场考试的\(a_i,b_i\)值,\(a_i<b_i\),\(a_i,b_i\)代表这场考试可以考的时间,问最少需要多少天来考完n场考试,如果不能考完就输出-1思路:......
  • 【面试题】vue2双向绑定原理:深入响应式原理defineProperty、watcher、get、set
    响应式是什么?Vue最独特的特性之一~就是我们在页面开发时,修改data值的时候,数据、视图页面需要变化的地方变化。主要使用到哪些方法?用 ​​Object.defineProperty给watcher对......
  • Short Question
    传送门题意:计算\(\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}min(\vertp_i-p_j\vert,\vertq_i-q_j\vert)\)思路:可以转换为\(\sum\limits_{i=1}^{N}\s......
  • Camera Raw 15 for mac/Win(PS Raw增效工具) 中文
    AdobeCameraRaw(RAW处理工具)最新版是一款功能十分强大的raw文件处理工具,CameraRaw支持不用的数码相机拍摄制作的RAW文件,可以说是摄影爱好者必备的一款软件。Mac版详情:Ca......
  • 使用 Doxygen 从源代码生成 UML 类图
    Doxygen简介Doxygen是一个编写软件参考文档的工具,也是从带注释的C++源代码生成文档的事实上的标准工具。这意味着该文档是直接写在源代码中的,因此比较容易保持更新。Dox......
  • 1488_人月神话阅读笔记_胸有成竹
    有这么好的口碑,无需怀疑,这本书肯定是一本好书。但是由于语言的差异,可能我目前看的这一本中文译本或许少了很多原有的意思。我们选择是吃快餐还是吃精品菜,有时候需要忍受中间......