📅  最后修改于: 2023-12-03 15:27:35.508000             🧑  作者: Mango
给定一个数组nums,对于其中的每个元素nums[i],求该元素前面所有大于它的元素之和sums[i],并将这些和存储在一个新的数组中返回。
输入: nums = [1,2,3,2,1] 输出: [0, 1, 3, 1, 0]
输入: nums = [5, 4, 3, 2, 1] 输出: [0, 0, 0, 0, 0]
遍历数组nums,对于每个元素nums[i],分别求其前面所有大于它的元素之和sums[i],最后将所有的sums[i]存储在一个新的数组中返回。
具体实现可以通过两次循环来实现:外层循环遍历数组nums,内层循环查找所有大于当前元素的元素,并将它们的值累加到sums[i]中。
此外,在内层循环中,可以通过二分查找等算法来加速元素的查找过程,提高算法的效率。
本算法的时间复杂度为O(n^2),其中n为数组的长度。当使用优化算法(如二分查找等)时,可以将时间复杂度降至O(nlogn)。
以下是本算法的Python实现:
def sum_of_previous_greater_numbers(nums):
"""
给定数组的大于当前数字的先前数字的总和
:param nums: 给定数组
:return: 新的数组,其中每个元素表示原数组中该位置之前(包括该位置)所有大于该位置元素之和
"""
sums = [0] * len(nums)
for i in range(len(nums)):
for j in range(i):
if nums[j] > nums[i]:
sums[i] += nums[j]
return sums
以下是使用二分查找优化后的Python实现:
def sum_of_previous_greater_numbers(nums):
"""
给定数组的大于当前数字的先前数字的总和
:param nums: 给定数组
:return: 新的数组,其中每个元素表示原数组中该位置之前(包括该位置)所有大于该位置元素之和
"""
def binary_search(arr, target):
"""
二分查找算法
:param arr: 目标数组
:param target: 目标元素
:return: 目标元素在数组中的下标,若不存在则返回-1
"""
low, high = 0, len(arr) - 1
while low <= high:
mid = (low + high) // 2
if arr[mid] > target:
high = mid - 1
else:
low = mid + 1
return low
sums = [0] * len(nums)
sorted_nums = []
for i in range(len(nums)):
sums[i] = sum(sorted_nums[:binary_search(sorted_nums, nums[i])])
sorted_nums[binary_search(sorted_nums, nums[i]):binary_search(sorted_nums, nums[i])] = [nums[i]]
return sums
以上即为本算法的代码实现和时间复杂度分析。