剑指 Offer 51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
解析:
当然可以树状数组,但归并代码更容易记住
每次归并时,如果取的是右半边的,说明左半边的[p, m]区间的数是大于A[q]这个数的
因此ret += (m - p + 1)
class Solution { public: void merge(vector<int> &nums, int l, int r, int& ret) { if(l >= r) return; int m = (l + r) / 2; merge(nums, l, m, ret); merge(nums, m + 1, r, ret); int p = l, q = m + 1; vector<int> C; while(p <= m || q <= r) { if(p > m || (q <= r && nums[p] > nums[q])) { C.push_back(nums[q]), q++, ret += (m - p + 1); } else C.push_back(nums[p]), p++; } for(int i = 0; i < C.size(); i++) { nums[l + i] = C[i]; } } int reversePairs(vector<int>& nums) { int ret = 0; int n = nums.size() - 1; merge(nums, 0, n, ret); return ret; } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-04-15 Euler Circuit UVA - 10735(混合图输出路径)