• [LeetCode] Count of Smaller Numbers After Self


    https://leetcode.com/problems/count-of-smaller-numbers-after-self/#/description

    解法1:暴力

    class Solution {
    public:
        vector<int> countSmaller(vector<int>& nums) {
            if (nums.empty()) return vector<int>();
            
            int n = nums.size();
            vector<int> count(n, 0);
            for (int i = 0; i < n; ++i) {
                for (int j = i + 1; j < n; ++j) {
                    if (nums[j] < nums[i]) count[i]++;
                }
            }
            
            return count;
        }
    };
    

    注:暴力会超时。

    解法2:归并排序

    class Solution {
    public:
        vector<int> countSmaller(vector<int>& nums) {
            if (nums.empty()) return vector<int>();
            
            int n = nums.size();
            vector<int> count(n, 0);
            vector<pair<int, int> > nodes;  // pair: (val, idx)
            for (int i = 0; i < n; ++i) {
                nodes.push_back(make_pair(nums[i], i));
            }
            solve(count, nodes, 0, n-1);
            
            return count;
        }
    private:
        void solve(vector<int>& count, vector<pair<int, int> >& nodes, int start, int end) {
            if (start >= end) return;
            
            int mid = start + (end - start) / 2;
            solve(count, nodes, start, mid);
            solve(count, nodes, mid+1, end);
            merge(count, nodes, start, mid, end);
        }
        
        void merge(vector<int>& count, vector<pair<int, int> >& nodes, int start, int mid, int end) {
            vector<pair<int, int> > helper(end - start + 1);
            int p = start, q = mid + 1, r = 0;
            while (p <= mid && q <= end) {
                if (nodes[p].first > nodes[q].first) {
                    count[ nodes[p].second ] += (end - q + 1);
                    helper[r++] = nodes[p++];
                } else {
                    helper[r++] = nodes[q++];
                }
            }
            while (p <= mid) helper[r++] = nodes[p++];
            while (q <= end) helper[r++] = nodes[q++];
            copy(helper.begin(), helper.end(), nodes.begin() + start);
        }
    };
    
  • 相关阅读:
    = =写个prim希望能够巨巨们看的懂
    poj2389 普通的大数乘法
    Codeforces 378C
    hdoj1272 小希的迷宫
    hihoCoder搜索二·骑士问题
    hihoCoder扩展欧几里得
    hihoCoder 1032
    664A
    【水水水】678A
    Codeforces Round #357 (Div. 2)C. Heap Operations
  • 原文地址:https://www.cnblogs.com/ilovezyg/p/6877214.html
Copyright © 2020-2023  润新知