Python中实现删除元素的升序列表的索引程序
假设我们有一个由不同值组成的列表,并且我们想以非递减的顺序删除每个数字。我们必须按它们删除的顺序找到数字的索引。
因此,如果输入是nums = [4, 6, 2, 5, 3, 1],则输出将是[5, 2, 3, 0, 1, 0],因为我们首先删除1,所以数组变成[4, 6, 2, 5, 3],然后删除2,数组变成[4, 6, 5, 3],然后删除3我们得到[4, 6, 5],然后删除4我们得到[6, 5],删除5,[6],最后删除6。
解决此问题,我们将遵循以下步骤−
- 定义一个my_sort()函数。这将采取inds
- 如果inds的大小<=$1,则
- 返回inds
- sorted_inds:=一个新的列表
- 中间:= inds的大小/2
- 左:= my_sort(inds[从索引0到中间]),右:= my_sort(inds[从索引中间到最后])
- I :=0, j :=0
- 当i
- 如果nums[left[i]]
- 将left[i]插入sorted_inds的末尾
- i:= i+1
- 否则,
- 将right[j]插入sorted_inds的末尾
- larger[right[j]]:=larger[right[j]]+left的大小-i
-
j := j + 1
- 将left[从索引i到结尾]插入sorted_inds
- 将right[从索引j到结尾]插入sorted_inds
- 返回sorted_inds
- 从主方法中执行以下操作−
- larger:=大小为nums的新列表,并用0填充
- my_sort(num_range 0 to size of nums)
- num_larger_pairs:为每个(nums,larger)创建一对并对它们进行排序
- 返回包含num_larger_pairs中的所有e[1]的列表
示例(Python)
让我们看以下实现以获得更好的理解 −
class Solution:
def solve(self, nums):
return solve(nums)
def solve(nums):
def my_sort(inds):
if len(inds) <= 1:
return inds
sorted_inds = []
mid = len(inds) // 2
left, right = my_sort(inds[:mid]), my_sort(inds[mid:])
i = j = 0
while i < len(left) and j < len(right):
if nums[left[i]] < nums[right[j]]:
sorted_inds.append(left[i])
i += 1
else:
sorted_inds.append(right[j])
larger[right[j]] += len(left) - i
j += 1
sorted_inds.extend(left[i:])
sorted_inds.extend(right[j:])
return sorted_inds
larger = [0] * len(nums)
my_sort(range(len(nums)))
num_larger_pairs = sorted(zip(nums, larger))
return [e[1] for e in num_larger_pairs]
ob = Solution()
nums = [4, 6, 2, 5, 3, 1]
print(ob.solve(nums))
输入
[4, 6, 2, 5, 3, 1]
输出
[5, 2, 3, 0, 1, 0]