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

湖南网站托管沈阳做网站 0诚金网络专业

湖南网站托管,沈阳做网站 0诚金网络专业,营销型网站重要性,郑州的做网站公司有哪些在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。 示例 1: 输入:record [9…

在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。

示例 1:

输入:record = [9, 7, 5, 4, 6]
输出:8
解释:交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。

提示:

0 <= record.length <= 50000

LCR 170. 交易逆序对的总数 - 力扣(LeetCode)

 这个题目要用归并排序来写,暴力解法很容易想得到。刚好借这个题目来复习一下归并排序。

归并排序的代码如下:

public class MergeSort {// 归并排序的主方法public static void mergeSort(int[] arr) {if (arr == null || arr.length <= 1) {return; // 如果数组为空或只有一个元素,直接返回}int[] temp = new int[arr.length]; // 临时数组,用于合并mergeSort(arr, 0, arr.length - 1, temp);}// 递归分治private static void mergeSort(int[] arr, int left, int right, int[] temp) {if (left < right) {int mid = left + (right - left) / 2; // 计算中间位置mergeSort(arr, left, mid, temp);     // 对左半部分排序mergeSort(arr, mid + 1, right, temp); // 对右半部分排序merge(arr, left, mid, right, temp);  // 合并两个有序部分}}// 合并两个有序数组private static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left;    // 左半部分的起始索引int j = mid + 1; // 右半部分的起始索引int k = 0;       // 临时数组的起始索引// 将两个有序数组合并到临时数组中while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}// 将左半部分剩余的元素复制到临时数组while (i <= mid) {temp[k++] = arr[i++];}// 将右半部分剩余的元素复制到临时数组while (j <= right) {temp[k++] = arr[j++];}// 将临时数组中的元素复制回原数组k = 0;while (left <= right) {arr[left++] = temp[k++];}}

需要注意这段代码:

// 将临时数组中的元素复制回原数组k = 0;while (left <= right) {arr[left++] = temp[k++];}

写的时候容易漏掉,临时数组的元素一定要返回到原数组中。 

我们会发现在归并排序的过程中都会比较两个子序列中两个数的大小,在合并两个子序列的过程中,右边的数组指针指向i项,比左边的元素小,由于左右子序列都是已经排好序的了,那么右边数组就有i项比左边现在这个元素小,也就是有i个子序列。注意一开始指针指向子数组末尾。

基于这个思想,只要在归并排序的过程中统计逆序对个数就行了。

class Solution {public int reversePairs(int[] record) {if (record == null || record.length <= 1) {return 0; // 如果数组为空或只有一个元素,直接返回}int[] temp = new int[record.length]; // 临时数组,用于合并int num = mergeSort(record, 0, record.length - 1, temp);return num;}private int mergeSort(int[] arr, int left, int right, int[] temp){if(left >= right){return 0;}int mid = left + (right - left)/2;int l = mergeSort(arr, left, mid, temp);int r = mergeSort(arr, mid + 1, right, temp);if (arr[mid] <= arr[mid + 1]) {return l + r;}int cur = merge(arr, left, mid, right, temp);return l + r + cur;}private int merge(int[] arr, int left, int mid, int right, int[] temp){int i = mid;int j = right;int k = right;//临时数组的索引int reversePairsNum = 0;//逆序对个数。while (i >= left && j > mid) {if (arr[i] > arr[j]) {reversePairsNum += (j - mid);temp[k] = arr[i];k--;i--;} else {temp[k] = arr[j];k--;j--;}}// 将左半部分剩余的元素复制到临时数组while (i >= left) {temp[k--] = arr[i--];}// 将右半部分剩余的元素复制到临时数组while (j > mid) {temp[k--] = arr[j--];}// 将临时数组中的元素复制回原数组for (i = left; i <= right; i++) {arr[i] = temp[i];}return reversePairsNum;}
}

 很多细节没注意到,一开始写成i > left导致总是漏掉最小元素的逆序对,我觉得还是归并的熟练度不够。我是按照剑指offer里面思路写的,把归并排序逆过来了。比较直观。但是逆过来的时候等号取不取得到要注意一下。建议手动排序一下。

力扣上采用的是正向的归并排序,不容易出错:

 private int mergeAndCount(int[] record, int left, int mid, int right, int[] temp) {for (int i = left; i <= right; i++) {temp[i] = record[i];}int i = left;int j = mid + 1;int count = 0;for (int k = left; k <= right; k++) {if (i == mid + 1) {record[k] = temp[j];j++;} else if (j == right + 1) {record[k] = temp[i];i++;} else if (temp[i] <= temp[j]) {record[k] = temp[i];i++;} else {record[k] = temp[j];j++;count += (mid - i + 1);}}return count;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solutions/216984/shu-zu-zhong-de-ni-xu-dui-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

其实二者的本质是一样的,【3,5,7,9】和 【4,6,8,10】当5>4的时候就把(7,4)  (9,4)  算进去。所以每次count只要加上mid-i +1即可。

我一开始想用j - mid发现在偶数是对的,奇数就是错的,因为比如[3,5,7,8][4,6,9]这样的数组,因为奇数个的会把mid取在left这边,就会导致8为第一项的逆序对无法加入,因为不会出现8>?的判断条件。

http://www.dtcms.com/wzjs/791116.html

相关文章:

  • 响应式网站的尺寸长春火车站现在正常通车吗
  • 申请渠道门户网站是什么意思重庆企业网站制作外包
  • 网站建设 海口中企动力做销售的感受
  • 织梦网站模板如何安装做网站放哪个科目
  • 网站设计和备案绵阳的网站制作公司
  • 一站式网站设计清华紫光网站建设
  • 关键词搜索工具app360优化大师下载安装
  • 个人设计师网站 青春wordpress底部自定义
  • 海外网站代理如何申请网站域名注册
  • 帝国和织梦哪个做网站好如何将网站转成小程序
  • 首页网站怎么做创办网站需要多少钱
  • 深圳手机网站制作价钱怎么用phpcmf做网站
  • 郑州市中原区建设局网站荆门seo
  • 怎么注册网站域名备案那种网站2021
  • 众划算网站开发有哪些做问卷调查赚钱的网站
  • 网站网站建设费进什么科目c 高性能网站开发
  • 邯郸建设企业网站信息查询app
  • 广西建设教育协会网站平面设计范文
  • 塔式服务器主机建网站宝安公司网站制作哪家公司好
  • 辽宁省营商环境建设监督局网站广州建设工程领域平台登录
  • 生产企业网站有哪些网站运营刚做时的工作内容
  • 专业网站seo推广移动应用开发与服务
  • 漳州本地企业网站建设服务WordPress免插件广告
  • 芜湖服装网站建设wordpress 3.7.1
  • 怎么做网站编辑电子商务专业毕业后干什么
  • 餐饮加盟网站制作服装设计基础
  • 制作网站哪家服务好微信网站开发需要什么技术
  • 网站建设邀请函网站开发与应用总结
  • 苏州企业网站制作服务dw课设做网站
  • eclipse 开发jsp网站开发标志网