LeetCode 2016 338,347,343

来源:互联网 发布:正德福飞机模型淘宝 编辑:程序博客网 时间:2024/06/04 00:55

338 Counting Bits

class Solution {public:    vector<int> countBits(int num)    {        vector<int> ans;        ans.clear();        ans.resize(num+1);        ans[0]=0;        int p;        if (num<=0) return ans;        for(p=1;p*2<=num;p*=2)        {            for(int i=0,j=p;i<p;(i++,j++))            {                ans[j]=ans[i]+1;            }        }        for(int i=0,j=p;j<=num;(i++,j++))        {            ans[j]=ans[i]+1;        }        return ans;    }};



347 Top K Frequent Elements

1. 我的//负数也有可能,比如[-1,-1]//题意理解错了,不是重复出现k次以上的,而是重复出现的次数按照从大到小排序//的前k个。。我勒个去。。好久不刷题,理解能力也退化了。。囧了个囧//所以还是用map吧.class Solution {public:    vector<int> topKFrequent(vector<int>& nums, int k)    {        vector<int>ans;        ans.clear();        map<int,int> freHash;        freHash.clear();        int len=nums.size();        for(int i=0;i<len;i++)        {            if (freHash.find(nums[i])!=freHash.end())                freHash[nums[i]]++;            else                freHash[nums[i]]=1;        }        vector<pair<int,int> > result;        for(map<int,int>::iterator i=freHash.begin();i!=freHash.end();i++)        {            result.push_back(make_pair(i->second,i->first ));        }        sort(result.begin(),result.end());        for(int i=0;i<result.size();i++)        {            cout<<result[i].first<<"  ";            cout<<result[i].second<<endl;        }        for(int i=result.size()-1,j=0;i>=0 && j<k;i--,j++)            ans.push_back(result[i].second);        return ans;    }};2. 讨论里面一个只有6行的神Codeclass Solution {    public:        vector<int> topKFrequent(vector<int>& nums, int k) {            unordered_map<int, int> my_map;            for_each (begin(nums), end(nums), [&my_map](int i){ my_map[i]++;});            vector<pair<int, int>> pv(begin(my_map), end(my_map));            nth_element(begin(pv), begin(pv)+k, end(pv), [](pair<int, int> a, pair<int, int> b){return a.second > b.second;});            vector<int> result;            transform(begin(pv), begin(pv)+k, back_inserter(result), [](pair<int, int> a){return a.first;});            return result;        }    };


343 Integer Break

小学奥数题,我仍旧记得那个口诀“要三不要二,要二不要一”先把n整除三余数为零,则把n都拆成3余数为1,则拿一个3出来,加上这个余数1,拆成2个2余数为2,则要这个2class Solution {public:    int integerBreak(int n)    {        if (n==2) return 1;        if (n==3) return 2;        int p=n/3;        int remain=n-p*3;        if (remain==0) return pow3(p);        if (remain==1) return pow3(p-1)*4;        if (remain==2) return pow3(p)*2;        return 0;    }    int pow3(int p)    {        int ans=1;        for(int i=1;i<=p;i++)            ans*=3;        return ans;    }};



0 0