leetcode315

来源:互联网 发布:淘宝流量来源分析 编辑:程序博客网 时间:2024/05/04 04:24

该题目是一道典型的分治问题,统计逆序数可以采用经典的mergeAndSort算法实现,但是难点在于如何返回每一个位置的逆序情况。由于sort的时候要交换位置,在此开辟了另一个数组find存储原始映射关系。

再提交过程中,经过三次提交最终AC:
遇到了内存不足的情况,采用vector<> &解决
要关注初始情况。对于nums数组为空时需要单独处理

心得:
由于程序功能比较多,不要一蹴而就,要分几次解决
对于函数返回参数要求比较多的时候,还是python好用啊

代码块

class Solution {public:    vector<int> sortAndCount(int left,int right,vector<int>& nums,vector<int>& find,vector<int>& count)// index is from left to right    {        vector<int> numsLeft;        vector<int> numsRight;        vector<int> findLeft;        vector<int> findRight;        find.clear();        if(left!=right)        {            numsLeft=sortAndCount(left,(left+right)/2,nums,findLeft,count);            numsRight=sortAndCount((left+right)/2+1,right,nums,findRight,count);        }        else        {            find.push_back(left);            numsLeft.push_back(nums[left]);            return numsLeft;        }        return mergeAndSort(numsLeft,numsRight,findLeft,findRight,find,count);    }    vector<int> mergeAndSort(vector<int>& numsLeft,vector<int>& numsRight,vector<int>& findLeft,vector<int>& findRight,vector<int>& find,vector<int>& count)    {        int leftIndex=0;        int rightIndex=0;        vector<int> newsNew;        while(leftIndex<numsLeft.size()||rightIndex<numsRight.size())        {            if(leftIndex<numsLeft.size()&&rightIndex<numsRight.size())            {                if(numsLeft[leftIndex]<=numsRight[rightIndex])                {                    newsNew.push_back(numsLeft[leftIndex]);                    find.push_back(findLeft[leftIndex]);                    count[findLeft[leftIndex]]+=rightIndex;                    leftIndex++;                }                else                {                    newsNew.push_back(numsRight[rightIndex]);                    find.push_back(findRight[rightIndex]);                    rightIndex++;                }            }            else            {                if(leftIndex==numsLeft.size()&&rightIndex<numsRight.size())                {                    newsNew.push_back(numsRight[rightIndex]);                    find.push_back(findRight[rightIndex]);                    rightIndex++;                }                else if(leftIndex<numsLeft.size()&&rightIndex==numsRight.size())                {                    newsNew.push_back(numsLeft[leftIndex]);                    find.push_back(findLeft[leftIndex]);                    count[findLeft[leftIndex]]+=rightIndex;                    leftIndex++;                }                else{}            }        }        return newsNew;    }    vector<int> countSmaller(vector<int>& nums) {        vector<int> find;        vector<int> result;        vector<int> count(nums.size(),0);        if(nums.size()==0)            return count;        else        {            result=sortAndCount(0,nums.size()-1,nums,find,count);            return count;        }    }};
0 0
原创粉丝点击