LeetCode 2016 338,347,343

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行的神Code
class 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,则要这个2

class 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;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值