当前位置: 首页 > wzjs >正文

如何网站建设团队如何做好网络营销管理

如何网站建设团队,如何做好网络营销管理,网站开发与优化课程总结,网站续费有什么作用目录 1 问题描述 1.1 输入描述: 1.2 示例1 1.3 示例2 2 解题思路 2.1 暴力解法 2.2 归并排序法 3 代码实现 3.1 暴力解法 3.2 归并排序法 4 代码解析 4.1 暴力解法 4.1.1 初始化 4.1.2 判断是否是逆序对 4.2 归并排序法 4.2.1 InversePairs 主函数 …

目录

1 问题描述

1.1 输入描述:

1.2 示例1

1.3 示例2

2 解题思路

2.1 暴力解法

2.2 归并排序法

3 代码实现

3.1 暴力解法

3.2 归并排序法

4 代码解析

4.1 暴力解法

4.1.1 初始化

4.1.2 判断是否是逆序对

4.2 归并排序法

4.2.1 InversePairs 主函数

4.2.2 归并排序 merge_sort__ 递归拆分

4.2.3 归并 merge__ 统计逆序对

5 总结


1 问题描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007
数据范围:  对于 50%50% 的数据, size≤104size≤104
对于 100%100% 的数据, size≤105size≤105

数组中所有数字的值满足 0≤val≤1090≤val≤109

要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)

1.1 输入描述:

题目保证输入的数组中没有的相同的数字

1.2 示例1

输入:

[1,2,3,4,5,6,7,0]

返回值:

7

1.3 示例2

输入:

[1,2,3]

返回值:

0

2 解题思路

2.1 暴力解法

通过两层嵌套循环,外层循环 i 遍历数组中的每个元素,内层循环 ji+1 开始,检查 nums[i] > nums[j] 是否成立,若成立则递增逆序对计数 p++。最终,返回 p % 1000000007 以避免结果溢出。

2.2 归并排序法

采用归并排序的方法高效计算数组中的逆序对。在 InversePairs 函数中,调用 merge_sort__ 递归地对数组进行归并排序,并在合并过程中计算逆序对。merge_sort__ 先递归地将数组拆分为左右两部分,再在 merge__ 过程中合并,同时统计逆序对。合并时,如果左半部分的 arr[i] > arr[j]j 来自右半部分),则意味着 arr[i] 及其后续所有元素均大于 arr[j],因此逆序对数 ret 需要累加 (mid - i + 1),并取模 1000000007 以防溢出。

3 代码实现

3.1 暴力解法

    int InversePairs(vector<int>& nums) {// write code herelong long p = 0;int n = nums.size();for(int i = 0; i+1 < n; i++){for(int j = i+1; j < n; j++){if(nums[i] > nums[j]){p++;}}}return fmod(p, 1000000007);}

3.2 归并排序法

class Solution {
private:const int kmod = 1000000007;
public:int InversePairs(vector<int> data) {int ret = 0;merge_sort__(data, 0, data.size() - 1, ret);return ret;}void merge_sort__(vector<int> &arr, int l, int r, int &ret) {if (l >= r) {return;}int mid = l + ((r - l) >> 1);merge_sort__(arr, l, mid, ret);merge_sort__(arr, mid + 1, r, ret);merge__(arr, l, mid, r, ret);}void merge__(vector<int> &arr, int l, int mid, int r, int &ret) {vector<int> tmp(r - l + 1);int i = l, j = mid + 1, k = 0;while (i <= mid && j <= r) {if (arr[i] > arr[j]) {tmp[k++] = arr[j++];// 奥妙之处ret += (mid - i + 1);ret %= kmod;}else {tmp[k++] = arr[i++];}}while (i <= mid) {tmp[k++] = arr[i++];}while (j <= r) {tmp[k++] = arr[j++];}for (k = 0, i = l; i <= r; ++i, ++k) {arr[i] = tmp[k];}}
};

4 代码解析

4.1 暴力解法

4.1.1 初始化
        long long p = 0;int n = nums.size();

初始化,p用来计算逆序对个数,n为循环边界。 

4.1.2 判断是否是逆序对
        for(int i = 0; i+1 < n; i++){for(int j = i+1; j < n; j++){if(nums[i] > nums[j]){p++;}}}

使用两层嵌套循环统计逆序对,外层循环 i遍历数组的前 n-1 个元素。内层循环 ji+1 开始,遍历 i 之后的元素,检查 nums[i] > nums[j] 是否成立。如果满足 nums[i] > nums[j],则 p++ 记录一个逆序对。

4.2 归并排序法

4.2.1 InversePairs 主函数
int InversePairs(vector<int> data) {int ret = 0;merge_sort__(data, 0, data.size() - 1, ret);return ret;
}

ret 变量用于存储逆序对的个数。调用 merge_sort__data 进行归并排序,同时统计逆序对。

4.2.2 归并排序 merge_sort__ 递归拆分
void merge_sort__(vector<int> &arr, int l, int r, int &ret) {if (l >= r) {return;}int mid = l + ((r - l) >> 1);merge_sort__(arr, l, mid, ret);merge_sort__(arr, mid + 1, r, ret);merge__(arr, l, mid, r, ret);
}

该函数不断递归拆分数组,直到 l >= r(即子数组长度为 1)。递归调用 merge_sort__ 对左右子数组分别排序。最后调用 merge__ 进行合并并计算逆序对。 

4.2.3 归并 merge__ 统计逆序对
void merge__(vector<int> &arr, int l, int mid, int r, int &ret) {vector<int> tmp(r - l + 1);int i = l, j = mid + 1, k = 0;while (i <= mid && j <= r) {if (arr[i] > arr[j]) {tmp[k++] = arr[j++];// 统计逆序对数量ret += (mid - i + 1);ret %= kmod;} else {tmp[k++] = arr[i++];}}while (i <= mid) tmp[k++] = arr[i++];while (j <= r) tmp[k++] = arr[j++];for (k = 0, i = l; i <= r; ++i, ++k) {arr[i] = tmp[k];}
}

该方法利用双指针合并两个有序子数组,并在合并过程中统计逆序对。指针 i 遍历左半部分(lmid),j 遍历右半部分(mid + 1r)。当 arr[i] > arr[j] 时,说明 arr[i] 及其后续所有元素(mid - i + 1 个)都大于 arr[j],构成逆序对,累加 ret 并对 1000000007 取模防止溢出。排序时,较小的元素先存入 tmp,保持整体有序,最终将 tmp 复制回 arr,完成归并排序。

5 总结

本文介绍了两种计算数组逆序对的方法:暴力解法和归并排序法。暴力解法使用两层嵌套循环,逐一比较元素,时间复杂度为O(n^2),适用于小规模数据。归并排序法利用归并排序的分治思想,结合双指针合并两个有序子数组,并在合并过程中统计逆序对,时间复杂度降为O(n log n),适用于大规模数据。具体实现中,递归地拆分数组,合并时通过比较左右子数组元素,累加逆序对数量。归并排序法高效、稳定,且满足题目对时间和空间的复杂度要求,是解决该问题的推荐方案。


文章转载自:

http://nLt5ULBz.gtnyq.cn
http://28pO1a3g.gtnyq.cn
http://ZU8TFZo5.gtnyq.cn
http://AxA3F8zN.gtnyq.cn
http://E745VkNc.gtnyq.cn
http://o8tvw98b.gtnyq.cn
http://jVtVG93Z.gtnyq.cn
http://AMHAifkE.gtnyq.cn
http://xdaWX1uo.gtnyq.cn
http://O11Iv6qE.gtnyq.cn
http://aIixXJxJ.gtnyq.cn
http://StWpd8p0.gtnyq.cn
http://b5yREXTF.gtnyq.cn
http://99Uz5Lwc.gtnyq.cn
http://WHxYhXS4.gtnyq.cn
http://kNtfwQ2P.gtnyq.cn
http://EV64mV0m.gtnyq.cn
http://3nbUVIhG.gtnyq.cn
http://ump5Z3tP.gtnyq.cn
http://LsctzNn6.gtnyq.cn
http://2Q37XOrA.gtnyq.cn
http://3KA0dyTh.gtnyq.cn
http://DCfjUrs6.gtnyq.cn
http://knL4nNSE.gtnyq.cn
http://CNLQpqqL.gtnyq.cn
http://Fe8kdPFz.gtnyq.cn
http://qilCMW83.gtnyq.cn
http://GYilJLxx.gtnyq.cn
http://O6UaENXs.gtnyq.cn
http://WU1TfNtf.gtnyq.cn
http://www.dtcms.com/wzjs/667823.html

相关文章:

  • 开发区网站开发语言免费送网站
  • 关于网站的建设论文户外网站模板
  • 嘉兴网站建设正规公司有没有找项目的网站
  • 西安网站建设官网wordpress登录页面自定义
  • 网站建设的培训心得网站的优化
  • 国内免费域名注册网站网站内容维护有哪些方面
  • 广州建网站要多少钱手机上怎么做网站创业
  • 网站建设 台州wordpress建站不懂程序
  • 淘客网站让别人做做网站PAAS系统
  • 长沙门户网站建设公司wordpress展示
  • 唐山正规做网站的公司做网站能赚钱
  • 兰州做网站客户网站宣传的手段有哪些?(写出五种以上)
  • 关停网站的申请网络营销成功案例介绍
  • 仿皮皮淘网站开发全程培训门户cms模板
  • 做招标代理应关注的网站什么网站可以在家做美工兼职
  • 机票酒店 网站建设福建省建设厅网站人员
  • 营销网站建设网站制作公司市场推广专员
  • wordpress 仿站 教程怎么做淘宝客优惠劵网站
  • 自媒体135网站免费下载安装做百度网站每年的费用多少合适
  • 如何建立公司网站建议和规则wordpress主题php破解
  • 网站建设的基本费用域名备案怎么注销
  • 建设网站需要哪些费用四川住房城乡建设周刊网站
  • 教务在线网站开发报告书网站栏目做树形结构图
  • 某网站seo诊断分析和优化方案中国建设招标信息网站
  • 福州市网站建设有限公司企业培训内容
  • 网站建设使用什么软件有哪些营销型企业网站分析与诊断
  • 网站域名地址是什么php 网站迁移
  • 惠州做网站建设价格短视频推广引流方案
  • 网站离线浏览器 怎么做新手学做网站必备软件
  • 东莞公司网站策划语文建设网站