标签:end 数组 idx res self start 计算 data 逆序
描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007数据范围: 对于 50\%50% 的数据, size\leq 10^4size≤104
对于 100\%100% 的数据, size\leq 10^5size≤105 数组中所有数字的值满足 0 \le val \le 10000000≤val≤1000000
要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
输入描述:
题目保证输入的数组中没有的相同的数字- 思路:采用归并排序算法
class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def InversePairs(self, data: List[int]) -> int: _, res = self.merge_sort(0, len(data) - 1, data) print(len(_), _) return res % 1000000007 def merge_sort(self, start, end, data): if start > end: return [], 0 if start == end: return [data[start]], 0 mid = (start + end) >> 1 left_d, l_c = self.merge_sort(start, mid, data) right_d, r_c = self.merge_sort(mid + 1, end, data) c = l_c + r_c res = [] l_idx = r_idx = 0 while True: if l_idx >= len(left_d): res.extend(right_d[r_idx:]) break if r_idx >= len(right_d): res.extend(left_d[l_idx:]) break if left_d[l_idx] <= right_d[r_idx]: res.append(left_d[l_idx]) l_idx += 1 else: res.append(right_d[r_idx]) c += len(left_d) - l_idx r_idx += 1 return res, c def list_to_list_node(l): head = ListNode(None) temp = head for i in l: temp.next = ListNode(i) temp = temp.next return head.next def list_node_to_list(head): temp = head res = [] while temp: res.append(temp.val) temp = temp.next return res if __name__ == '__main__': a = [1,2,3,4,5,6,7,0,9] print(len(a)) print(Solution().InversePairs(a))
标签:end,数组,idx,res,self,start,计算,data,逆序 来源: https://www.cnblogs.com/liuxuelin/p/16254931.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。