如果乙個陣列已經排好序,當是公升序的時候,那麼逆序對個數為0,當時降序的時候,那麼逆序對的個數最多。
對陣列進行逆序對計算的意義:距離陣列的排序的距離多遠。
例如:3,5,1,4,7,有三個逆序對,(3,1),(5,1),(5,4)
兩個迴圈,時間複雜度為o(n^2)
def countinver(nums):
n = len(nums)
count = 0
for i in range(n):
for j in range(i+1,n):
if (nums[i] > nums[j]):
count += 1
return count
arr = [3,5,1,4,7]
countinver(arr)
out[18]: 3
其實這種方法就是在歸併排序中,新增計算逆序的計數過程。
def merge(left,right):
result = list()
i,j = 0,0
count = 0
while i < len(left) and j < len(right) :
if left[i] < right[j]:
i += 1
elif right[j] < left[i]:
j += 1
count += (len(left) - i)#已排好序
result += left[i:]
result += right[j:]
return result,count
#o(nlogn)
def countinvfast(arr):
if len(arr) < 2:
return arr,0
middle = len(arr) // 2
left,inv_left = countinvfast(arr[:middle])
right,inv_right = countinvfast(arr[middle:])
merged,count = merge(left,right)
count += (inv_left + inv_right)
return merged,count
arr = [3,5,1,4,7]
countinvfast(arr)
out[28]: ([1, 3, 4, 5, 7], 3)
o(nlogn) ,是排序的時間的複雜度,
待優化。
歸併排序鏈結
0702 資料結構與演算法 動態規劃python
學會三個問題 揹包問題 最長公共子串 最長公共子串行 力扣原題 特別說明 這道題比較煩人的是判斷回文子串。因此需要一種能夠快速判斷原字串的所有子串是否是回文子串的方法,於是想到了 動態規劃 動態規劃 的乙個關鍵的步驟是想清楚 狀態如何轉移 事實上,回文 天然具有 狀態轉移 性質。乙個回文去掉兩頭以後...
資料結構與演算法 鍊錶逆序
package com.lxd.leetcode.demo.linked classname linkedreversed description 單項鍊表逆序 author xiaod date 2020 6 21 version v1.0 public class linkedreversed ...
資料結構 單鏈表逆序
2 單鏈表逆序 第二個題目是很經典的 單鏈表逆序 問題。很多公司的面試題庫中都有這道題,有的公司明確題目要求不能使用額外的節點儲存空間,有的沒有明確說明,但是如果面試者使用了額外的節點儲存空間做中轉,會得到乙個比較低的分數。如何在不使用額外儲存節點的情況下使乙個單鏈表的所有節點逆序?我們先用迭代迴圈...