首页 > 其他分享 >逆序对个数

逆序对个数

时间:2024-12-08 15:31:58浏览次数:9  
标签:count arr int 个数 fromIndex mid -- 逆序

题目

一个数列,如果左边的数大,右边的数小,则称这两个数为一个逆序对。求出一个数列中右多少个逆序对。

解法1

暴力遍历所有可能的数对。

package com.company;

public class Test17 {
    public static void main(String[] args) {
        int[] arr={1	,4	,9,	6	,2,	8,	7	,3	,5};

        int count=0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = i+1; j < arr.length; j++) {
                if(arr[i]>arr[j]){
                    count++;
                }
            }
            System.out.println(count);
        }
        System.out.println(count);
    }
}



解法2

在归并排序的过程中,如果左半部分的数大于右半部分的数,则出现了逆序对,并且不止一个。

package com.company;

import java.util.Arrays;

public class Test18 {
    public static int count=0;
    public static void main(String[] args) {
        int[] arr={1	,4	,9,	6	,2,	8,	7	,3	,5};

        sort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
        System.out.println(count);
    }
    public static void sort(int[] arr,int fromIndex,int toIndex){
        if(toIndex-fromIndex<=0){
            return;
        }
        int mid=(fromIndex+toIndex)/2;
        sort(arr,fromIndex,mid);
        sort(arr,mid+1,toIndex);
        int[] help=new int[toIndex-fromIndex+1];
        int i=mid,j=toIndex,k=help.length-1;
        while(i>=fromIndex && j>=mid+1){
            if(arr[i]>arr[j]){
                count=count+(j-mid);

                help[k]=arr[i];
                k--;
                i--;
            }else{
                help[k]=arr[j];
                k--;
                j--;
            }
        }
        System.out.println(count);
        while(i>=fromIndex){
            help[k]=arr[i];
            k--;
            i--;
        }
        while(j>=mid+1){
            help[k]=arr[j];
            k--;
            j--;
        }
        i=fromIndex;
        k=0;
        for (int l = fromIndex; l <=toIndex ; l++) {
            arr[l]=help[l-fromIndex];
        }
    }
}

标签:count,arr,int,个数,fromIndex,mid,--,逆序
From: https://blog.csdn.net/zhourongxiang1/article/details/144321318

相关文章

  • 当Doris遇上福尔摩斯:一个数据库优化器的推理日记
    当Doris遇上福尔摩斯:一个数据库优化器的推理日记Doris智能化SQL优化引擎智能优化背后的故事作为一名数据分析师,你一定遇到过这样的场景:写了一个看似简单的SQL查询,信心满满地点击执行,然后…不知不觉喝完三杯咖啡,查询还在默默转圈圈。"这也太慢了吧!"小王抓狂地盯着屏......
  • 实现字节二进制位逆序的两种方法
    需求:将11010010转变为01001011,可以看出是一个简单的从最低位到最高位的一个倒序需求。网上搜到的都是位运算法,这在计算量大的应用中,一个字节运算8次是非常可耻的。解决问题的办法当然是越简单越好,查表法将一个字节的256种组合放到数组内,用的时候直接从内存取结果,不用运算,但用......
  • #C01L06P01. C01.L06.复合语句、数值交换、三个数的最值与排序.复合语句
    例1:运行下列程序,输入5,观察运行结果并思考程序是怎样运行的。#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn,a=0,b=0,c=0; cin>>n; if(n<0) a=a+2; b=b+2; c=c+2; cout<<a<<""<<b<<""<<c; re......
  • 有 n 个整数,使前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m个数
    题目描述        有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面的m个数,见下图,写一个函数实现该功能。代码实现voidMove(int*arr,intn,intm){if(m<=0||m>=n)return;//创建m个长度的int数组int*brr=(int*)malloc(m*si......
  • 数组中出现次数超过一半的数字整型数组有一个数字出现的次数超过总数的一半,请找出该
    题目描述        数组中出现次数超过一半的数字整型数组有一个数字出现的次数超过总数的一半,请找出该数字,例如长度为9的数组{1,2,3,2,4,2,5,2,2}。由于2出现的次数是5次,超过一半,所以结果为2。代码实现算法1:先排序,然后中间值就是要找的数字 intCmp......
  • SQL面试题——腾讯SQL面试题 占据好友封面个数
    腾讯SQL面试题占据好友封面个数有两个表,朋友关系表user_friend,用户步数表user_steps。朋友关系表包含两个字段,用户id,用户好友的id;用户步数表包含两个字段,用户id,用户的步数查询:占据多少个好友的封面(在好友的列表中排行第一,且必须超过好友的步数)--好友关系表+-------+-......
  • 将一个数组逆序输出。-多语言
    目录C语言实现方法1: 交换元素方法2: 使用辅助数组方法3:使用递归 方法4:使用标准库函数(C99及以上)总结Python实现方法1: 交换元素方法2:使用切片 方法3:使用reversed()函数方法4:使用list.reverse()方法方法5:使用for循环和append()......
  • 2024-12-02:划分数组得到最小的值之和。用go语言,你有两个数组,nums 和 andValues,它们的
    2024-12-02:划分数组得到最小的值之和。用go语言,你有两个数组,nums和andValues,它们的长度分别为n和m。定义数组的“值”为其最后一个元素。你的任务是将nums划分为m个不重叠的连续子数组。对于第i个子数组[li,ri],该子数组的所有元素通过按位与运算后,结果必须等......
  • 使用函数输出一个整数的逆序数
    Description本题要求实现一个求整数的逆序数的简单函数。(注意:逆序后去掉前导0)函数接口定义:intreverse(intnumber);其中函数reverse须返回用户传入的整型number的逆序数。Input一行一个整数n。Output一个整数表示答案。SampleInput1 -12340SampleOutput1-4......
  • leetcode 191. 位1的个数
    191.位1的个数给定一个正整数 n,编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中设置位的个数。1<=n<=2^32-1法一:暴力解:classSolution{public:inthammingWeight(uint32_tn){intcount=0;while(n){if(n%2==1)......