leetcode315 計算右側小於當前元素的個數

2021-10-01 02:32:54 字數 2108 閱讀 1221

給定乙個整數陣列 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 個更小的元素.

設定乙個新陣列queue,從後向前遍歷原陣列,將當前遍歷的元素插入到queue中的正確位置,這個位置即為右側比他小的元素的個數。

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...