LeetCode Count of Smaller Number After Self

You are given an integer array nums and you have to return a new counts array. The counts array has the property where counts[i] is the number of smaller elements to the right of nums[i].

Example:

Given nums = [5, 2, 6, 1]

To the right of 5 there are 2 smaller elements (2 and 1).
To the right of 2 there is only 1 smaller element (1).
To the right of 6 there is 1 smaller element (1).
To the right of 1 there is 0 smaller element.
Return the array [2, 1, 1, 0].

Solution 1(divide and conquer):

vector<int> countSmaller(vector<int>& nums) {
        int n = nums.size();
        vector<int> cnt(n, 0);
        vector<int> index(n);
        for(int i = 0; i<n; i++)
            index[i] = i;
        mergeSort(nums, cnt, index, 0, n-1);
        return cnt;
    }
    void mergeSort(vector<int>& nums, vector<int>& cnt, vector<int>& index, int left, int right) {
        if(left >= right) return;
        int mid = (left + right)/2;
        mergeSort(nums, cnt, index, left, mid);
        mergeSort(nums, cnt, index, mid+1, right);
        merge(nums, cnt, index, left, right);
    }
    void merge(vector<int>& nums, vector<int>& cnt, vector<int>& index, int left, int right) {
        int mid = (left+right)/2;
        int i = left, j = mid+1, k = 0, count = 0;
        vector<int> newindex(right-left+1);
        while(i<=mid || j<=right){
            if(i>mid)
                newindex[k++] = index[j++];
            else if(j>right){
                cnt[index[i]] += count;
                newindex[k++] = index[i++];
            }
            else if(nums[index[i]] <= nums[index[j]]){
                cnt[index[i]] += count;
                newindex[k++] = index[i++];
            }
            else{
                newindex[k++] = index[j++];
                count++;
            }
        }
        for(i = 0; i<=right-left; i++)
            index[left+i] = newindex[i];
    }

notes:
Should change the index instead of the array itself.
reference:
https://leetcode.com/problems/count-of-smaller-numbers-after-self/discuss/76583/11ms-JAVA-solution-using-merge-sort-with-explanation

Solution 2(augmented BST):

class TreeNode{
    public:
        TreeNode *left = NULL, *right = NULL;
        int val, sum, dup = 1;
        TreeNode(int val){
            this->val = val;
            this->sum = 0;
        }
    };
    vector<int> countSmaller(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(n, 0);
        TreeNode* root = NULL;
        for(int i = n-1; i>=0; i--)
            root = insert(nums[i], ans, root, i, 0);
        return ans;
    }
    TreeNode* insert(int num, vector<int>& ans, TreeNode* root, int i, int preSum) {
        if(root == NULL){
            root = new TreeNode(num);
            ans[i] = preSum;
        }
        else if(num == root->val){
            root->dup++;
            ans[i] = preSum + root->sum;
        }
        else if(num < root->val){
            root->sum++;
            root->left = insert(num, ans, root->left, i, preSum);
        }
        else{
            root->right = insert(num, ans, root->right, i, preSum + root->sum + root->dup);
        }
        return root;
    }

reference:
https://leetcode.com/problems/count-of-smaller-numbers-after-self/discuss/76580/9ms-short-Java-BST-solution-get-answer-when-building-BST

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寓涨,更是在濱河造成了極大的恐慌,老刑警劉巖抚垄,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓶竭,居然都是意外死亡督勺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門斤贰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來智哀,“玉大人,你說我怎么就攤上這事荧恍〈山校” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵送巡,是天一觀的道長摹菠。 經(jīng)常有香客問我,道長骗爆,這世上最難降的妖魔是什么次氨? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮摘投,結(jié)果婚禮上煮寡,老公的妹妹穿的比我還像新娘。我一直安慰自己犀呼,他們只是感情好幸撕,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著外臂,像睡著了一般坐儿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宋光,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天貌矿,我揣著相機與錄音,去河邊找鬼罪佳。 笑死逛漫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的菇民。 我是一名探鬼主播尽楔,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼第练!你這毒婦竟也來了阔馋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤娇掏,失蹤者是張志新(化名)和其女友劉穎呕寝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婴梧,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡下梢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了塞蹭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孽江。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖番电,靈堂內(nèi)的尸體忽然破棺而出岗屏,到底是詐尸還是另有隱情,我是刑警寧澤漱办,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布这刷,位于F島的核電站,受9級特大地震影響娩井,放射性物質(zhì)發(fā)生泄漏暇屋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一洞辣、第九天 我趴在偏房一處隱蔽的房頂上張望咐刨。 院中可真熱鬧,春花似錦屋彪、人聲如沸所宰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仔粥。三九已至,卻和暖如春蟹但,著一層夾襖步出監(jiān)牢的瞬間躯泰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工华糖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留麦向,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓客叉,卻偏偏與公主長得像诵竭,于是被迫代替她去往敵國和親话告。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,292評論 0 10
  • 01 我的一個朋友曉曉,大學畢業(yè)后因為參加同學的婚禮裳朋,認識一個北漂男孩天哥病线。天哥瘦瘦高高的,臉蛋長得還算精致鲤嫡,一笑...
    孜曉閱讀 901評論 5 50
  • 現(xiàn)在是凌晨兩點多送挑,一連幾個夜都無法入睡,想寫點什么暖眼,在自己還清醒能記住過往的回憶里惕耕,想把發(fā)生在自己身上的事寫下來,...
    高估別人閱讀 37評論 0 0
  • 蕭蕭月诫肠,冷冽寒冬夜赡突。強自彷徨,獨等待区赵。月光寒惭缰,風凜冽。孤燈床前倚笼才,落雨不成席漱受。待到明月夜,只思鄉(xiāng)骡送。鄉(xiāng)間伊人啐昂羡,嬉戲...
    逍遙為樂閱讀 412評論 0 0
  • 我家就住在鑫農(nóng)湖附近虐先,世代為耕,但也是書香門第派敷。昨天一早蛹批,天漸漸的放晴了,我開心的吃過早餐篮愉,跨上了那張不啟用的舊事...
    米瀾盛若閱讀 161評論 0 0