📅  最后修改于: 2023-12-03 14:54:59.525000             🧑  作者: Mango
在数组中,元素右侧的较大元素的计数是指在数组中,对于每个元素,它右侧的元素中大于它的元素个数。例如,对于数组 [3, 4, 9, 6, 1]
,元素 3 右侧的较大元素为 2(4 和 9),元素 4 右侧的较大元素为 1(9),元素 9 右侧的较大元素为 0,元素 6 右侧的较大元素为 1(9),元素 1 右侧的较大元素为 0。
本题可以采用两种方法进行求解。
暴力法的思路就是对于每个元素,依次遍历其右侧的元素,计算比该元素大的元素的个数。这种方法的时间复杂度为 O(n^2),并不是十分高效。
Code:
class Solution:
def countSmaller(self, nums: List[int]) -> List[int]:
n = len(nums)
res = [0] * n
for i in range(n):
count = 0
for j in range(i + 1, n):
if nums[j] < nums[i]:
count += 1
res[i] = count
return res
归并排序的特点是可以在排序的同时求解逆序对的个数,本题也可以使用类似的思路进行求解。首先将数组按照归并排序的方式进行排序,合并时计算出右侧元素比左侧元素大的个数,这个数量就是逆序对的个数。由于归并排序的时间复杂度为 O(nlogn),因此本题采用的方法是归并排序。
Code:
class Solution:
def countSmaller(self, nums: List[int]) -> List[int]:
n = len(nums)
res = [0] * n
def merge_sort(start, end):
if start >= end:
return
mid = (start + end) // 2
merge_sort(start, mid)
merge_sort(mid + 1, end)
merge(start, mid, end)
def merge(start, mid, end):
i, j = start, mid + 1
temp = []
cnt = 0
while i <= mid and j <= end:
if nums[i] <= nums[j]:
temp.append(nums[i])
res[i] += cnt
i += 1
else:
temp.append(nums[j])
cnt += 1
j += 1
while i <= mid:
temp.append(nums[i])
res[i] += cnt
i += 1
while j <= end:
temp.append(nums[j])
j += 1
nums[start:end + 1] = temp
merge_sort(0, n - 1)
return res
以上就是本题的两种解法。方法一比较简单易懂,时间复杂度较高;方法二较为高效,但需要更多的思考和代码实现。