3193.统计逆序对的数目 &无重复字符的最长子串

简介: 【10月更文挑战第3天】

3193 统计逆序对的数目

思路:

首先将问题分解为子问题,考虑第i位放什么,如示例1整个排列[0,1,2],恰好有2个逆序对,分情况讨论
● 末尾元素为0,前面两个元素(1,2)都会与0组成一对逆序对,也就是增加两点贡献值,此时[1,2]还需要贡献0(2-2)对贡献值,
● 末尾元素为1,前面两个元素(0,2)中2可以与1组成一对逆序对,贡献值为1,此时[0,2]还需要贡献1(2-1)贡献值。
● 末尾元素为2,前面两个元素(0,1)中没有可以与2组成逆序对的,贡献值为0,此时[0,1]还需要贡献2(2-0)贡献值。

以此类推,i=1时,我们不需要知道排列中的元素是那些,只需要知道排列长度,以及需要构造出多少逆序对。
构造函数dfs(end,cnt),用于计算排列逆序对为cnt且满足requirements的排列[0...end]的个数,从示例一中得,dfs(2,2)=dfs(1,0)+dfs(1,1)+dfs(1,2)得递推公式,一般化对公式:

● 如果end-1在requirements有所要求,且对应得逆序对要求数量为r,那么我们计算dfs(end,cnt),此时最后一个元素(end)的取值最多只有一种可能,(因为end-1位置要求了r个逆序对,在end位置位置上,我们想要cnt个逆序对,所以最后一个元素需要产生cnt-r个逆序对,所以最多一种可能)。
如果0<=cnt-r<=end也就是r<=cnt<=end+r就说明有一个数放在end位置上能符合条件,dfs(end,cnt)=dfs(end-1,r);否则就说明不存在这种情况,dfs(end,cnt)=0
● 如果end-1不在requirements的要求中,那么我们需要遍历末尾元素所有的可能性,及遍历的范围为$$(0~min(end,cnt))$$, 递推公式$$dfs(end,cnt)=\sum_{i=0}^{min(end,cnt)} dfs(end-1,cnt-i)$$.
边界条件:当end=0时如果cnt!=0,那么不存在这样的排列,(因为长度为1,没法构成逆序对),那么[end=0,cnt=0]一定是1.所以边界条件是,dfs(0,0)=1.
优化记忆化搜索。
上面递推公式中,
● 如果cnt>=end:
$$dfs(end,cnt)=\sum_{i=0}^{end}dfs(end-1,cnt-i),$$ $$dfs(end,cnt-1)=\sum_{i=0}^{end}dfs(end-1,cnt-i-1)$$
$$dfs(end,cnt)=dfs(end,cnt-1)-dfs(end-1,cnt-1-end)+dfs(end-1,cnt)$$
● 如果cnt<=end:
$$dfs(end,cnt)=\sum_{i=0}^{cnt}dfs(end-1,cnt-i),$$
$$dfs(end,cnt)=\sum_{i=0}^{cnt-1}dfs(end-1,cnt-i-1),$$
可以得到:$$dfs(end,cnt)=dfs(end,cnt-1)+dfs(end-1,cnt)$$

class Solution {
public:
    int numberOfPermutations(int n, vector<vector<int>>& requirements) {
        map<int,int> mp;
        int len=requirements.size();
        int maxx=0;
        mp[0]=0;
        for(int num=0;num<len;num++){
            mp[requirements[num][0]]=requirements[num][1];
            maxx=max(maxx,requirements[num][1]);
        }
        if(mp[0]) return 0;
        const long long mod=1e9+7;
        vector<vector<long long> > dp(n+2,vector<long long>(maxx+2,-1));
        function<int(int,int)>dfs = [&](int end,int  cnt)->int{
            if(cnt<0) return 0;
            if(end==0) return 1;
            if(dp[end][cnt]!=-1)return dp[end][cnt];
            if(mp.count(end-1)){
                int r = mp[end-1];
                if(r<=cnt&&cnt<=end+r){//可以用end-1,r转移过来
                    return dp[end][cnt]=dfs(end-1,r);
                }
                return 0;
            }else {
                if(cnt>end) return dp[end][cnt]=(dfs(end,cnt-1)-dfs(end-1,cnt-1-end)+dfs(end-1,cnt)+mod)%mod;
                else {
                    return dp[end][cnt]=(dfs(end,cnt-1)+dfs(end-1,cnt))%mod;
                }
            }
        };
        return dfs(n-1,mp[n-1]);
    }
};

无重复字符的最长子串 - 力扣(LeetCode)

题解:这个题是个滑动窗口的典型题,
左右两个指针维护滑动窗口,这个滑动窗口内是符合条件的(这个题是窗口里无重复字符)。右指针添加新的元素,左指针排除不符合的元素。这里使用mp来判断窗口中的无重复子串。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n=s.size();
        int l=0,r=0;
        map<char,int>mp;
        int ans=0;
        int res=0;
        while(r<n){
            if(mp[s[r]]==0){
                ans++;
                mp[s[r]]=1;
                r++;
            }else {
                mp[s[l]]=0;
                l++;
                ans--;
            }
            res= max(res,ans);
        }
        return res;
    }
};
目录
相关文章
|
C++ Windows
Visual Studio 2019 实现并行编译
使用 Visual Studio 2019 实现并行编译
942 0
Visual Studio 2019 实现并行编译
|
安全 开发者
SwiftUI极简教程02:Image图片的使用
SwiftUI极简教程02:Image图片的使用
1764 1
SwiftUI极简教程02:Image图片的使用
|
JavaScript API
vue 3.0 所采用的 Composition Api 和 vue 2.0 使用的 Option Api 区别
vue 3.0 所采用的 Composition Api 和 vue 2.0 使用的 Option Api 区别
365 0
|
2月前
|
人工智能 搜索推荐 测试技术
2026年Geo优化师选师指南:学习Geo应该找哪位专家老师?
随着AI重塑搜索生态,GEO(生成式引擎优化)成为企业增长新刚需。2026年,全球市场规模将达380亿元,但超半数企业面临效果难量化、优化不稳定等挑战。IDC数据显示,仅30%企业实现可衡量增长。在此背景下,具备E-E-A-T权威标准与实战能力的导师至关重要。于磊老师首创“两大核心+四轮驱动”体系,融合人性化内容与可信验证,助力传统制造企业询盘增长120%,打造AI时代可持续获客范本,被公认为最具普适性与前瞻性的GEO领路人。
183 5
|
3月前
|
存储 搜索推荐 安全
电脑必备软件:PortableApps便携式软件管理工具安装使用教程:U盘装软件随身带
PortableApps是一款免费开源的便携式软件管理平台,支持将软件安装至U盘,即插即用,拔出不留痕迹。内置近500款实用软件,无需安装,跨平台使用便捷,支持个性化主题设置,让软件随身携带,工作学习更高效。
773 1
|
4月前
|
人工智能 运维 专有云
持续领先!阿里云入选2025年Gartner®分布式混合基础设施魔力象限
近日,Gartner发布2025年《分布式混合基础设施魔力象限》报告,在混合云场景下,阿里云凭借飞天企业版(Apsara Stack)、边缘云ENS和云盒CloudBox产品组合能力,在“执行能力”和“愿景完整性”两大维度分别处于亚太厂商中最高最远的位置。
357 6
|
数据可视化 大数据 定位技术
GIS:开源webgl大数据地图类库整理
GIS:开源webgl大数据地图类库整理
689 0
|
7月前
|
Windows
DirectX修复工具,修复游戏d3d11错误,ce-30391-6,DXGI,d3d9.dll,6204103和d3d11.dll文件丢失
DLL修复工具是一款轻量级软件,专注于解决因DLL文件缺失、异常或错误导致的系统崩溃问题。它能够快速扫描并修复常见的DLL文件错误,如msvcp.dll、vcruntime.dll等,适用于各类Windows系统。软件体积小巧,操作简单,资源占用低,适合需要高效修复DLL问题的用户使用。
171 1
|
8月前
|
人工智能 供应链 小程序
软件外包众包平台为何没有前途?深度剖析行业顽疾优雅草卓伊凡
软件外包众包平台为何没有前途?深度剖析行业顽疾优雅草卓伊凡
346 2
软件外包众包平台为何没有前途?深度剖析行业顽疾优雅草卓伊凡
|
6月前
|
开发者 Windows 容器
msixbundle
*.msixbundle 是一种用于 Windows 应用程序打包和分发 的文件格式,主要用于 Microsoft Store 或 企业内部分发 的应用。它是一种 打包容器,包含多个 .msix 或 .appx 包,通常用于为不同的架构(如 x86、x64、ARM)提供一个统一的安装包。