跟着姚桑学算法-数组中的逆序对

简介: 剑指offer算法

题. 数组中的逆序对

在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。

输入一个数组,求出这个数组中的逆序对的总数。

数据范围
给定数组的长度 [0,100]。

样例

输入:[1,2,3,4,5,6,0]

输出:6
AI 代码解读

【题解】--- 树状数组

用树状数组维护一个数字个数的序列;数据离线,逆向查询。
在每次查询一个数前,在树状数组里查询小于这个数的个数,也就是查询个数后面的逆序对的个数;
最后把这个数加一即可。

提到 树状数组树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于数组的单点修改&&区间求和.

另外一个拥有类似功能的是线段树

具体区别和联系如下:

  1. 两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树.
  2. 树状数组的作用被线段树完全涵盖, 凡是可以使用树状数组解决的问题, 使用线段树一定可以解决, 但是线段树能够解决的问题树状数组未必能够解决.
  3. 树状数组的突出特点是其编程的极端简洁性, 使用lowbit技术可以在很短的几步操作中完成树状数组的核心操作,其代码效率远高于线段树。

复杂度分析:

时间复杂度为O(NlogN)。
AI 代码解读

C++代码实现:

class Solution {
public:
    int cnt,n,c[1000000],ans;
    void add(int x){for(; x <= cnt; x += x & -x) c[x] ++;}
    int ask(int x)
    {
        int res = 0;
        for(; x; x -= x & -x) res += c[x];
        return res;
    }
    int inversePairs(vector<int>& nums) {
        set<int> st;
        unordered_map<int,int> ump;
        cnt = 0; ans = 0; n = nums.size();
        memset(c, 0, sizeof c);
        for(auto &i : nums) st.insert(i);
        for(auto it = st.begin(); it != st.end(); it++ ) ump[*it] = ++cnt;
        for(int i = nums.size() - 1; i >= 0; i--) ans += ask(ump[nums[i]] - 1), add(ump[nums[i]]);
        return ans;
    }
};
AI 代码解读
目录
打赏
0
0
0
0
3
分享
相关文章
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
39 7
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
115 23
|
6月前
|
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
70 0
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
104 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
70 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
8月前
|
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
8月前
|
【算法】模拟算法——外观数组(medium)
【算法】模拟算法——外观数组(medium)
|
8月前
|
【算法】前缀和——除自身以外数组的乘积
【算法】前缀和——除自身以外数组的乘积
|
8月前
|
【算法】前缀和——寻找数组的中心下标
【算法】前缀和——寻找数组的中心下标
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等