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

2021-08-22 13:43:59 字數 1064 閱讀 8175

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

思路:

從最右邊開始逐步構建一顆二叉搜尋樹

樹中維護有節點的值,小於該節點的數的數量less,左右節點,相同數字的數量

在每個位置構建完成樹之後,立即計算該位置小於該數的個數,由於新的點加入之後一定是處於葉節點的。

所以從根節點開始:

1.如果節點值大於目標值,那麼遞迴到節點的左節點進行計數

2.如果節點值等於目標值,返回該節點處less的值

3.節點值小於目標值,返回節點自身數量+less+遞迴右節點(因為大於節點值也有可能小於目標值)

code:

class solution ;

};node* add(node* root,int val)

return root;

}int getnum(node* root,int val)

vectorcountsmaller(vector& nums) ;

if(n==1) return ;

vectorcount(n,0);

node*root=new node(nums[n-1],0);

for(int i=n-2;i>=0;i--)

return count;

}};

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

315 計算右側小於當前元素的個數(困難題)

題目描述 給定乙個整數陣列 nums,按要求返回乙個新陣列 counts。陣列 counts 有該性質 counts i 的值是 nums i 右側小於 nums i 的元素的數量。示例 輸入 5,2,6,1 輸出 2,1,1,0 解釋 5 的右側有 2 個更小的元素 2 和 1 2 的右側僅有 1...