AcWing 788. 逆序对的数量_Java

简介: AcWing 788. 逆序对的数量_Java

活动 - AcWing

用暴力会超时,所以选择归并排序



 static int N=1000010;
    public static void main(String[] args)  {
        int []arr=new int[N];
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        for (int i = 0; i < n; i++) {
            arr[i]=sc.nextInt();
        }
        System.out.println(merge_sort(arr, 0, n - 1));
    }
    private static long merge_sort(int[] arr, int l, int r) {
        if(l>=r) return 0;
        int mid=l+r>>1;
        long result=0;
         int []s=new int[r-l+1];
        result=merge_sort(arr,l,mid)+merge_sort(arr,mid+1,r);
        int i=l,j=mid+1,k=0;
        while (i<=mid &&j<=r){
            if(arr[i]<=arr[j]) s[k++]=arr[i++];
            else{
                s[k++]=arr[j++];
                result+=mid-i+1;
            }
        }
        while (i<=mid) s[k++]=arr[i++];
        while (j<=r) s[k++]=arr[j++];
        for (i = l, k = 0; i <= r; i++, k++) {
            arr[i] = s[k];
        }
        return result;
    }
相关文章
|
人工智能 算法 Java
算法_逆序对_归并(java)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
|
算法 搜索推荐 Java
剑指 Offer 51:数组中的逆序对 (Java分治思想)
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
105 0
|
人工智能 算法 Java
逆序对(逆序对问题) 分而治之方法(分治法)java代码实现完整版(递归实现)
逆序对(逆序对问题) 分而治之方法(分治法)java代码实现完整版(递归实现)
406 0
逆序对(逆序对问题) 分而治之方法(分治法)java代码实现完整版(递归实现)
|
13天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
94 38
|
10天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
1天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
1天前
|
安全 Java 编译器
Java多线程编程的陷阱与最佳实践####
【10月更文挑战第29天】 本文深入探讨了Java多线程编程中的常见陷阱,如竞态条件、死锁、内存一致性错误等,并通过实例分析揭示了这些陷阱的成因。同时,文章也分享了一系列最佳实践,包括使用volatile关键字、原子类、线程安全集合以及并发框架(如java.util.concurrent包下的工具类),帮助开发者有效避免多线程编程中的问题,提升应用的稳定性和性能。 ####
18 1
|
5天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
6天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
31 4
下一篇
无影云桌面