码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 629. K个逆序对数组


    文章目录

    • 题目
    • 解题思路
    • 代码


    题目

    给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数。

    逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 a[i] > a[j],则其为一个逆序对;否则不是。

    由于答案可能很大,只需要返回 答案 mod 109 + 7 的值。

    示例 1:

    输入: n = 3, k = 0
    输出: 1
    解释:
    只有数组 [1,2,3] 包含了从1到3的整数并且正好拥有 0 个逆序对。

    n 的范围是 [1, 1000] 并且 k 的范围是 [0, 1000]。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/k-inverse-pairs-array
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解题思路

    看数据范围
    要用O(n*k)的方法,即样本对应模型
    dp[i][j]的含义:
    当我用12,3…n直到这些数字玩排列的情况下,正好逆序对数量有j个的排列有几个
    在这里插入图片描述
    第一列为0个逆序对,全填1
    在这里插入图片描述
    我们举出具体例子
    dp[5][3]: 1,2,3,4.5这些数字去排列,降序对的数量是3个的排列有几个?
    根据样本对应模型往往可能性的划分和结尾有关
    看这个5怎么摆放
    假设1,2,3,4 这4个数形成排列的逆序对数的排列我知道,即dp[4][3]
    在这里插入图片描述

    1)5放在最后面:dp[4][3]
    在这里插入图片描述

    2)5放在倒数第二位,形成1个逆序对,前4个数字只要凑出2个逆序对就行了:dp[4][2]
    在这里插入图片描述
    3)5放在倒数第三位,形成2个逆序对,前四个数字只要凑出1个逆序对就行了:dp[4][1]
    4)5放在倒数第四位,dp[4][0];
    在这里插入图片描述
    根据上面可知,dp[5][3]=dp[4][3]+dp[4][2]+dp[4][1]+dp[4][0]
    即dp[i][j]=dp[i-1][j]+…+dp[i-1][0];
    我们可以推出dp[5][4]=dp[4][4]+…dp[4][0]=dp[5][3]+dp[4][4]
    即dp[i][j]=dp[i][j - 1] + dp[i - 1][j]

    当j>=i的情况会有不同
    在这里插入图片描述
    我们可以知道
    dp[5][7]=dp[4][7…3]
    dp[5][8]=dp[4][8…4]
    即dp[5][8]=dp[4][8]+dp[5][7]-dp[4][3]
    即dp[i][j] = dp[i][j - 1] + dp[i - 1][j]- dp[i - 1][j - i]

    代码

    class Solution {
        public int kInversePairs(int n, int k) {
            if (n < 1 || k < 0) {
    			return 0;
    		}
            int[][] dp=new int[n+1][k+1];
            int mod = 1000000007;
            dp[0][0]=1;
            for(int i=1;i<=n;i++){ 
                dp[i][0]=1;
                for(int j=1;j<=k;j++){
                    dp[i][j]=(dp[i][j-1]+dp[i-1][j])%mod;
                    if(j>=i){
                        dp[i][j]=(dp[i][j]-dp[i-1][j-i]+mod)%mod;
                    }
                }
            }
            return dp[n][k];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    Obsidian+SyncTrayzor打造个人文档云同步平台
    【leetcode】【剑指offer Ⅱ】050. 向下的路径节点之和
    【Django 开发】面试招聘信息网站(用户登录注册&投在线递简历)
    WPF工控组态软件之冷却塔和空气压缩机开发
    信息学竞赛初中初赛模拟卷-有答案
    未在本地计算机上注册“Microsoft .ACE. OLEDB .12.0”提供程序
    Redis全文搜索教程之创建索引并关联源数据
    图文带你彻底弄懂MySQL事务原子性之UndoLog
    JSP居民信息采集系统yeclipse开发mysql数据库bs框架java编程jdbc详细设计
    【计算机网络笔记】TCP的拥塞控制机制
  • 原文地址:https://blog.csdn.net/xiaolu567/article/details/125900994
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号