(力扣每日一題)計算右側小於當前元素的個數

2021-10-08 00:28:05 字數 1528 閱讀 4241

給定乙個整數陣列 nums,按要求返回乙個新陣列 counts。陣列 counts 有該性質: counts[i] 的值是 nums[i] 右側小於 nums[i] 的元素的數量。

解題思路

方法一:暴力求解:通過兩層迴圈,一一比較,遍歷所有情況。複雜度為o(n^2)。

方法二:通過二分查詢改進暴利求解

在第一輪的基礎上第二輪的遍歷的複雜度。也就是把n減少到乙個複雜度更小的情況,一般選擇o(logn),即可用二分法快速找到有幾個比當前元素小,這就現實了從n降階到logn。

優化關鍵點

(1)對應每個單個元素,有乙個單調的(排好序的)list儲存所有在他右邊的元素。這個list用於後面使用二分檢索來找小於該元素的元素的個數。(2)快速使用二分檢索。

主要操作步驟:

1、無論nums裡面前面的數字怎麼排布,最後乙個元素對應的輸出一定是0。因為他的右邊沒有別的元素可以給他比較。

2、nums從右往左輸入。即方便不斷給sorted_nums的list新增新元素。sorted_nums為排序好的儲存當前素有右邊元素的list。

3、實現排序的方法是用bisect.insort將當前的元素放到sorted_nums中間對應的排序下的位置。

4、對於每個元素而言,右邊的所有元素已經存放在sorted_nums中,並且排好序。

5、可以直接使用bisect.bisect_left找到對應的元素在sorted_nums的下標。他的下標表示為在sorted_nums中比他小的元素的個數。把其一次新增到ans中去。

6、由於sorted_nums是從右往左新增的,ans新增index的順序也是從右往左的。所有最後返回的時候要重新顛倒回來。

演算法分析:

時間複雜度:第一輪迴圈遍歷所有元素o(n),第二輪迴圈使用二分檢索o(logn)。綜合來說是o(nlogn)。

空間複雜度:需要建立乙個sorted_nums來記錄排序好的右邊元素。所以是:o(n)。

class

solution

:def

countsmaller

(self, nums: list[

int])-

> list[

int]:if

not nums:

return

sorted_nums =

ans =

## 二分查詢bisect模組,python自帶的函式

for n in nums[::

-1]:

index = bisect.bisect_left(sorted_nums,n)

bisect.insort(sorted_nums,n)

return ans[::-1]

每日一題 力扣 計畫

98 驗證二叉搜尋樹 問題給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 1.節點的左子樹只包含小於當前節點的數。2.節點的右子樹只包含大於當前節點的數。3.所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true示例2 輸入 5 1 4...

力扣每日一題 6 14

1300 轉變陣列後最接近目標值的陣列和 給你乙個整數陣列 arr 和乙個目標值 target 請你返回乙個整數 value 使得將陣列中所有大於 value 的值變成 value 後,陣列的和最接近 target 最接近表示兩者之差的絕對值最小 如果有多種使得和最接近 target 的方案,請你返...

每日一題力扣48

給定乙個 n n 的二維矩陣 matrix 表示乙個影象。請你將影象順時針旋轉 90 度。你必須在 原地 旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另乙個矩陣來旋轉影象。正解 旋轉90度就是,先鏡面對稱,再轉置即可 class solution defrotate self,mat...