第17天
2020.07.11 周六
难度系数:困难
题目:315计算右侧小于当前元素的个数
给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。
示例:
输入: [5,2,6,1]
输出: [2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1).
2 的右侧仅有 1 个更小的元素 (1).
6 的右侧有 1 个更小的元素 (1).
1 的右侧有 0 个更小的元素.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-of-smaller-numbers-after-self
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————我是分割线——————————
解法:
思路:刚开始自己写了一个,超时了。看到这个题解真的妙啊。
把原数组nums[]反转,插入一个有序数组sortls中,并用bisect.bisect_left()返回插入元素位置的下标,保存在结果res[]中,最后逆序返回res即可。
补充:有关bisect库的知识,传送门:bisect()函数
代码:
import bisect
class Solution(object):
def countSmaller(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
sortls = [] #有序数组
res = [] #结果数组 最后把它倒序输出
for i in reversed(nums): #反转数组
idx = bisect.bisect_left(sortls, i) #返回要插入的位置的下标
res.append(idx) #将下标插入结果数组
sortls.insert(idx,i) #将元素按顺序插入有序数组
return res[::-1] #倒序输出
nums = [5,2,6,1]
print(Solution().countSmaller(nums))
#[2,1,1,0]
初始状态:
原数组nums = [5,2,6,1] 反转[1,6,2,5]
sortls = []
res = []
————————————————————
1.
原数组nums = [5,2,6,1] 反转[1,6,2,5]
sortls = [1]
res = [0] 元素1插入的位置下标为0
————————————————————
2.
原数组nums = [5,2,6,1] 反转[1,6,2,5]
sortls = [1,6]
res = [0,1] 元素6插入的位置下标为1
————————————————————
3.
原数组nums = [5,2,6,1] 反转[1,6,2,5]
sortls = [1,2,6]
res = [0,1,1] 元素2插入的位置下表为1
————————————————————
4.
原数组nums = [5,2,6,1] 反转[1,6,2,5]
sortls = [1,2,5,6]
res = [0,1,1,2] 元素5插入的位置下标为2
最后返回res的逆序 [2,1,1,0]