首页 > 学院 > 开发设计 > 正文

leetcode315

2019-11-08 02:08:57
字体:
来源:转载
供稿:网友

该题目是一道典型的分治问题,统计逆序数可以采用经典的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; } }};
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表