首页 > 其他分享 >五 505. 火柴排队 (归并排序|离散化)

五 505. 火柴排队 (归并排序|离散化)

时间:2024-03-25 20:11:49浏览次数:27  
标签:归并 排序 int mid ++ ai new Integer 505

五 505. 火柴排队 (归并排序|离散化)
image

思路:先将两组数组按(2 3 1 4 -> 2 0 1 3; 3 2 1 4 -> 2 1 0 3)规则排序,然后使用c数组建立双方的映射,从c[ai[i]]=bi[i],接着就是使用归并排序求c数组的逆序对即交换次数。

import java.util.*;

public class Main {
    private static int res;
    private static int mod = (int) (1e8 - 3);
    
    private static void merge_sort(int l, int r, Integer[] a) {
        if(l == r) return;
        int mid = l + ((r - l) >> 1);
        merge_sort(l, mid, a);
        merge_sort(mid + 1, r, a);
        int i = l, j = mid + 1, k = 0;
        int[] temp = new int[r - l + 1];
        while (i <= mid && j <= r) {
            if(a[i] > a[j]) {
                res = (res + mid - i + 1) % mod;
                temp[k++] = a[j++]; 
            }
            else {
                temp[k++] = a[i++];
            }
        }
        while(i <= mid) {
            temp[k++] = a[i++];
        }
        while(j <= r) {
            temp[k++] = a[j++];
        }
        for(int m = l, n = 0; l <= r && n < temp.length; m++, n++) {
            a[m] = temp[n];
        }
    }
    
    private static void work(Integer[] ai, int[] a, int n) {
        for (int i = 0; i < n; i++) {
            ai[i] = i;
        }
        Arrays.sort(ai, (o1, o2) -> Integer.compare(a[o1], a[o2]));
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            b[i] = sc.nextInt();
        }
        Integer[] ai = new Integer[n], bi = new Integer[n];
        work(ai, a, n);
        work(bi, b, n);
        Integer[] c = new Integer[n];
        for (int i = 0; i < n; i++) {
            c[ai[i]] = bi[i];
        }
        merge_sort(0, n-1, c);
        System.out.println(res);
    }
}

标签:归并,排序,int,mid,++,ai,new,Integer,505
From: https://www.cnblogs.com/he0707/p/18095215/lanqiaobei05

相关文章

  • 学习笔记之算法快速排序
    快速排序听说有的公司面试会考?0.0快速排序思想:分治法基本思想:1、从数列中选出一个数2、分区(遍历),比它大的放他右边,比它小的或者等于的,放他左边3、对左右区间重复第2步,直到区间只有一个数(递归)参考:快速排序|菜鸟教程(runoob.com)在该网站......
  • 排序算法练习——最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值
    最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值。解决这个问题可以使用桶排序的思想。具体步骤如下:找到数组中的最大值和最小值。根据数组的长度,将数组划分成一定数量的桶,每个桶存放一定范围内的元素。计算每个桶内元素的最小值和最大值。遍历桶,计算相邻......
  • 排序算法练习——按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺
    按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺序不同的字符串)分组到同一个组中。要按照字符串的异位词分组,可以使用哈希表来将每个字符串排序后作为键,相同键的字符串即为异位词。以下是实现这个算法的Python代码:fromcollectionsimportdefaultdict......
  • drf : 过滤 排序 分页
    过滤和排序并不是所有的接口都需要写,查询所有才需要过滤(根据条件过滤),排序(按某个规则排序,也可倒序)。导入模块:"""OrderingFilter:排序SearchFilter:过滤"""fromrest_framework.filtersimportOrderingFilter,SearchFilter过滤,内置的过滤,必须继承GenericAPIView,才......
  • python 递归树状结构 和 排序
    排序defrecursive_sort(self,categories):categories.sort(key=lambdax:x['sort'])forcategoryincategories:ifcategory['children']:category['children']=self.recursive_sort(ca......
  • 【算法】堆排序
    1.堆排序简介堆排序(heapsort)是由J.W.J.Williams于1964年发明的。是一种基于比较的排序算法,和选择排序一样,堆排序将数据序列分为已排序区域和未排序区域两部分。通过从未排列区域中获取最大元素并将其插入已排序区域,迭代这个操作来缩小未排序区域。与选择排序不同的......
  • 拓扑排序 洛谷B3644家谱树解法
    #include<bits/stdc++.h>usingnamespacestd;intd[101];//d[i]表示i点的入度个数intt[101][101];//t[i][j]表示i点到j点间有一条有向边queue<int>q;//q表示当前入度为0的节点intmain(){ //所有数组初始化为0 memset(d,0,sizeof(d)); memset(t,0,sizeof(t......
  • JavaScript 排序算法
    在这篇文章中,我将介绍几种常见的JavaScript排序算法,并对它们的原理和实现进行详细说明。排序算法是计算机科学中非常重要的基础知识之一,它们可以帮助我们对数据进行有效的整理和排序,提高程序的效率和性能。冒泡排序(BubbleSort)冒泡排序是最简单的排序算法之一,它通过不......
  • c++十大排序——快速排序
    1#include<iostream>usingnamespacestd;voidquickSort(intarr[],intbegin,intend){ if(begin>=end)return; intleft=begin; intright=end; inttemp=arr[left]; while(left<right){ //从后往前找比他小的放前面,从前往后找比它大的放后......
  • 【数据结构】快速排序(用递归)
    大家好,我是苏貝,本篇博客带大家了解快速排序,如果你觉得我写的还不错的话,可以给我一个赞......