前言🌧️
算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。
因为开发的过程就是把实际问题转换成计算机可识别的指令,也就是《数据结构》里说的,「设计出数据结构,在施加以算法就行了」。
当然,学习也是有侧重点的,作为前端我们不需要像后端开发一样对算法全盘掌握,有些比较偏、不实用的类型和解法,只要稍做了解即可。
题目🦀
剑指 Offer 51. 数组中的逆序对
难度困难
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4] 输出: 5
限制:
0 <= 数组长度 <= 50000
解题思路🌵
- 采用归并排序来解决此问题
- 将数组分解为一个个的子问题,再进行比较
- 分: 不断将数组从中点位置划分开(即二分法),将整个数组的排序问题转化为子数组的排序问题
- 治: 划分到子数组长度为 1 时,开始向上合并,不断将 较短排序数组
- 合并为 较长排序数组,直至合并至原数组时完成排序
解法🔥
/** * @param {number[]} nums * @return {number} */ var reversePairs = function(nums) { if(nums.length===0){return 0} let counter=0; function mergeSort(arr){ if(arr.length===1){return arr} //1拆分数组 //1.1获取中间下标 const mid =Math.floor(arr.length/2) const left=arr.slice(0,mid) const right=arr.slice(mid) const orderLeft=mergeSort(left) const orderRight=mergeSort(right) //合并 const res=[] while(orderLeft.length||orderRight.length){ if(orderLeft.length&&orderRight.length){ if(orderLeft[0]<=orderRight[0]){ res.push(orderLeft.shift()) }else{ res.push(orderRight.shift()) counter+=orderLeft.length } }else if(orderRight.length){ res.push(...orderRight) break; }else if(orderLeft.length){ res.push(...orderLeft) break; } } return res } mergeSort(nums) return counter };
时间复杂度:O(NlogN)
空间复杂度:O(n)
结束语🌞
那么鱼鱼的LeetCode算法篇的「LeetCode」剑指Offer-51数组中的逆序对⚡️
就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾
,欢迎加我好友
,一起沙雕
,一起进步
。