給定乙個整數陣列 nums,按要求返回乙個新陣列 counts。陣列 counts 有該性質: counts[i] 的值是 nums[i] 右側小於 nums[i] 的元素的數量。設定乙個新陣列queue,從後向前遍歷原陣列,將當前遍歷的元素插入到queue中的正確位置,這個位置即為右側比他小的元素的個數。示例:輸入: [5,2,6,1]
輸出: [2,1,1,0]
解釋:5 的右側有 2 個更小的元素 (2 和 1).
2 的右側僅有 1 個更小的元素 (1).
6 的右側有 1 個更小的元素 (1).
1 的右側有 0 個更小的元素.
bisect是python內建模組,用於有序序列的插入和查詢。
bisect還有bisect_left,insort_left的用法,和不帶left的用法的區別是:當插入的元素和序列中的某乙個元素相同時,該插入到該元素的前面(左邊,left),還是後面(右邊,right);如果是查詢,則返回該元素的位置還是該元素之後的位置。
線段樹,以陣列的最小值和最大值作作為根節點的左右區間,遍歷陣列每乙個元素num,num在某一區間出現過,則一邊建樹,一邊讓count++1,返回的是線段樹中比num小的值得數量。
解法一:
class solution(object):
def countsmaller(self, nums):
""":type nums: list[int]
:rtype: list[int]
"""import bisect
queue =
res =
for num in nums[::-1]:
# 該插入的位置
loc = bisect.bisect_left(queue, num)
# 排好序的陣列
queue.insert(loc, num)
return res[::-1]
解法二:
class node():
def __init__(self,begin,end):
self.begin = begin
self.end = end
self.mid = (begin+end)//2
self.count = 0
self.left = none
self.right = none
def add(self,num):
# 返回線段樹中比num小的值的數量
self.count += 1
if self.begin == self.end:
return 0
else:
if not self.left:
self.left = node(self.begin, self.mid)
if not self.right:
self.right = node(self.mid + 1, self.end)
if num <= self.mid:
return self.left.add(num)
else:
return self.left.count + self.right.add(num)
class solution(object):
def countsmaller(self, nums):
""":type nums: list[int]
:rtype: list[int]
"""if not nums:
return
mn = min(nums)
mx = max(nums)
root = node(mn,mx)
res =
# 這裡倒著計算,返回陣列前面比自己小的個數
for i in range(len(nums)-1,-1,-1):
# 一邊構建線段樹一邊計算答案
return res[::-1]
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...
315 計算右側小於當前元素的個數
給定乙個整數陣列 nums,按要求返回乙個新陣列 counts。陣列 counts 有該性質 counts i 的值是 nums i 右側小於 nums i 的元素的數量。示例 輸入 5,2,6,1 輸出 2,1,1,0 解釋 5 的右側有 2 個更小的元素 2 和 1 2 的右側僅有 1 個更小的...
LC 315 計算右側小於當前元素的個數
傳送門 思路 離散化權值樹狀陣列。顯然因為可能存在負數,所以先離散化一波,然後從右到左遍歷,將詢問值儲存起來,然後更新即可。define lowbit x x x class solution int query int x return ans vector int countsmaller ve...