首页 > 其他分享 >剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对

时间:2023-09-08 14:23:45浏览次数:37  
标签:Offer int nums 51 mid merge 数组 逆序

题目链接: 剑指 Offer 51. 数组中的逆序对

题目描述:

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

解法思路:

代码:
暴力做法:

func reversePairs(nums []int) int {
    var res int
    n := len(nums)
    if n == 0 {
        return res
    }
    for i :=0 ;i < n;i++{
        for j:=i+1;j <n;j++{
            if nums[j]<nums[i]{
                res++
            }
            
        }
    }
    return res
}

采用归并排序的思想:

func reversePairs(nums []int) int {
    
    return merge(nums, 0, len(nums) - 1)
}

func merge(nums []int, l, r int) int {
    //递归的退出条件
    if l >= r {
        return 0
    }
    mid := (l + r) >> 1
    // 递归处理左边和右边
    res := merge(nums, l, mid) + merge(nums, mid+1, r)

    //单层递归的逻辑
    var tmp []int
    i, j := l , mid+1
    for i <= mid && j <= r {
        if nums[i] <= nums[j] {  //如果左边的比右边的小,正常放入合并后的tmp数组
            tmp = append(tmp,nums[i])
            i++
        } else { // 否则右边比左边小,则存在逆序对,逆序对的数量是 mid -i +1
            res += mid - i + 1
            tmp = append(tmp,nums[j])  //将右边的放入tmp
            j++
        }
    }
    // 将剩余的未处理的数,直接加入到tmp中
    for i <= mid {
        tmp = append(tmp,nums[i])
        i++
    }
    for j <= r {
        tmp = append(tmp,nums[j])
        j++
    }
    //最后这里,将合并后的数组,接到原数组的l的后面
    for i,v := range tmp {
        nums[l+i] = v
    }
    return res
}

标签:Offer,int,nums,51,mid,merge,数组,逆序
From: https://www.cnblogs.com/lxing-go/p/17687471.html

相关文章

  • CF1851 部分题解
    2023-07-3019:35:02前言因为我实在是太菜了,没时间也不会做最后两题,所以这里只有前\(5\)道签到题的题解。之后我有时间看了后两题的题解再来更新吧~A先不用看那么多七七八八的,搞清楚下面几点即可:高度不能相同。高度差得被整除。高度差不能太大。好了,然后就可以\(AC\)......
  • 剑指 Offer 49. 丑数
    题目链接:剑指Offer49.丑数题目描述:我们把只包含质因子2、3和5的数称作丑数(UglyNumber)。求按从小到大的顺序的第n个丑数。解法思路:代码://dp[i]代表第i个丑数//维护三个索引,不断乘235,谁小当前dp[i]选谁funcnthUglyNumber(nint)int{i2,i......
  • 剑指Offer 48. 最长不含重复字符的子字符串
    题目链接:剑指Offer48.最长不含重复字符的子字符串题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。解法思路:代码:funclengthOfLongestSubstring(sstring)int{varresintifs==""{returnres}//......
  • P5051 [COCI2017-2018#7] Timo
    题目传送门思路由于题目给出的顺序是——$1{th}\to2\to3{th}\to\dots\to(n-1)\ton^{th}$$\to(n-1){th}\to(n-2)\to\dots\to2{th}\to1\to2^{th}$因为我们每走一回在开头和结尾只走了一次,而其他位数则走了两次,这样的话我们再分组的时候就可以不按照$1\to\dots\ton$来执行......
  • 剑指 Offer 60. n个骰子的点数
    把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。 你需要用一个浮点数数组返回答案,其中第i个元素代表这n个骰子所能掷出的点数集合中第i小的那个的概率。 示例1:输入:1输出:[0.16667,0.16667,0.16667,0.16667,0.16667,0.16667......
  • 剑指 Offer 60. n个骰子的点数
    把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。 你需要用一个浮点数数组返回答案,其中第i个元素代表这n个骰子所能掷出的点数集合中第i小的那个的概率。 示例1:输入:1输出:[0.16667,0.16667,0.16667,0.16667,0.16667,0.16667......
  • 剑指 Offer 22. 链表中倒数第k个节点
    输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表:1->2->3->4->5,和k=......
  • qstat报错15137
    PBS服务报错,报错信息如下:socket_connect_unixfailed:15137socket_connect_unixfailed:15137socket_connect_unixfailed:15137qstat:cannotconnecttoserver(null)(errno=15137)couldnotconnecttotrqauthd 解决方法:启动“trqauthd”和“p......
  • 剑指 Offer 46. 把数字翻译成字符串
    题目链接:剑指Offer46.把数字翻译成字符串题目描述:解法思路:代码://dp[i]=dp[i-1]+dp[i-2]//dp[i]表示长度为i的数字,翻译成字符串有多少种functranslateNum(numint)int{s:=strconv.Itoa(num)n:=len(s)dp:=make([]int,n+1)dp[0]=1......
  • 剑指Offer
    题目链接:题目描述:解法思路:代码:funcfindNthDigit(nint)int{//1、确定是几位数(-10-90-900-9000等)//2、确定是几位数的第几位数(求第n位数是属于哪一个数的)//3、确定是属于那个数的第几位digit,digitNum,count:=1,1,9//digit表示是几位数;dig......