DHU高级程序语言设计-leetcode刷题18

18 前 K 个高频元素

问题描述:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
说明:
你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。输出时,首先输出频率最高的元素,如果频率相同,则先输出元素值较大的元素。(DHUoj上的条件跟力扣不一样的地方)
输入说明:
首先输入nums数组的长度n,
然后输入n个整数,以空格分隔。最后输入k。
输出说明:
首先输出频率最高的元素,如果频率相同,则先输出元素值较大的元素。元素之间以空格分隔。
输入范例:
8
1 1 1 2 2 3 3 4
3
输出范例:
1 3 2
代码:

#include<iostream>
#include<map>
#include<string>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;

class Solution {
public:
    static bool compare(pair<int,int>& a, pair<int,int>& b)
    {
        if(a.second!=b.second)
        return a.second>b.second;
        else
        return a.first>b.first;
    }
    vector<int> topKFrequent(vector<int>& nums, int k) 
    {
        vector<int> res;
        int n=nums.size();
        map<int,int> tmp;//数字,出现频次 
        for(int i=0;i<n;i++)
        {
            tmp[nums[i]]++;
        }
        vector<pair<int,int>> vec;
        for(auto it:tmp)
        {
            vec.push_back(make_pair(it.first,it.second));
        }//将tmp的内容一一入组 
        sort(vec.begin(),vec.end(),compare);//排序
        for(int i=0;i<k;i++)
        {
            res.push_back(vec[i].first);
        }
        return res;
    }
};

int main()
{
    int n,data,k;
    vector<int> nums;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>data;
        nums.push_back(data);
    }
    cin>>k;
    vector<int> res=Solution().topKFrequent(nums,k);
    for(int i=0; i<res.size(); i++)
    {
        if (i>0)
            cout<<" ";
        cout<<res[i];
    }
    return 0;
}

还是直白的排序适合我 别的题解有点茫然 比如大顶堆什么的…我太菜了
附一个扣了0.02分看的测试用例
输入:
700
999 900 743 112 -96 839 615 374 209 -579 568 162 949 403 -437 274 -785 73 -329 -608 740 -816 -726 14 617 391 855 894 264 -935 900 -462 -106 -317 948 727 -83 859 247 505 -446 559 565 715 475 242 56 -475 722 -529 93 787 -269 478 35 338 -316 -41 573 -323 -590 623 745 -596 -177 770 -762 -146 482 677 218 -778 839 -110 396 -582 -3 323 -900 -904 -589 -197 -781 117 370 -395 578 -317 -239 -350 -347 -45 -421 439 -236 367 130 -466 747 -666 454 16 809 751 169 26 195 -237 984 652 -442 -140 -624 -792 -346 -133 141 -60 896 820 822 -424 -33 529 837 579 -966 -754 -538 -163 913 -480 631 510 -179 -881 -77 169 -886 544 -530 501 -83 -673 -151 456 -509 571 679 -845 469 -596 355 -239 -719 104 605 62 797 -76 837 413 925 382 75 417 79 -395 -665 92 -762 -135 497 157 27 -45 -374 -885 -252 799 11 -436 685 718 810 -475 507 -928 739 513 -572 -531 -180 -405 560 -435 899 347 -386 359 -573 -742 980 60 373 34 662 864 204 -668 562 -600 375 -458 566 79 301 -31 -190 -623 539 -125 808 -462 -618 364 902 -757 -758 474 -422 865 557 377 363 -346 -221 82 117 978 441 224 -414 843 342 805 -174 529 594 578 -774 -949 -423 154 752 612 -959 26 18 -118 -327 -740 -745 -990 751 526 704 439 -368 936 785 789 701 -945 603 -570 178 -394 195 931 -384 167 -938 -980 -982 205 935 875 900 65 -962 -842 597 -191 770 -456 -645 62 -435 942 -571 -98 -781 -543 -203 -47 -165 156 906 702 689 -9 471 719 -896 315 810 -606 24 714 248 992 -119 -387 772 949 -11 -82 -249 -128 172 766 4 -320 55 428 322 -628 664 194 175 999 -489 694 222 795 -822 -323 -789 -495 743 -339 -158 112 989 845 -196 -480 -900 457 112 160 -175 688 -384 -895 140 -200 -779 701 524 -594 -182 966 -357 -515 32 -690 -32 628 98 0 -566 919 356 -481 649 -796 999 -3 878 759 -754 -349 959 576 -840 276 -227 496 431 -407 -669 -668 737 61 -718 -639 -899 -468 409 925 761 189 -74 -268 -260 -314 728 507 267 981 -24 655 178 722 900 936 159 511 926 -349 974 -67 881 261 309 -801 431 -721 -989 36 -801 335 225 634 227 -181 -305 600 964 -285 -340 -655 550 989 129 -596 917 581 421 -276 -953 -494 406 809 -994 170 715 -72 8 -600 593 -483 -714 -452 -773 -547 -245 -896 276 -175 109 521 -333 -699 535 695 -861 -836 363 -998 681 -618 -956 493 593 233 62 -534 528 640 -144 -522 990 225 440 -797 -388 -344 334 388 910 -230 279 818 -241 -446 -550 956 -16 200 -258 722 -79 802 423 -9 -281 -690 -214 353 -757 -447 -587 -511 -327 -900 -423 -908 -978 349 962 -424 -93 -78 -913 -10 -18 466 -6 -327 586 -409 -144 92 923 659 958 130 -514 -373 858 527 775 -614 601 769 36 420 -883 913 865 -28 -168 192 -161 -340 -911 -923 368 6 -316 -534 -84 -827 -618 67 -113 410 674 -107 457 -928 743 142 -243 -843 170 566 985 486 76 999 481 -854 457 -707 71 845 606 205 -976 -777 657 -412 819 -646 -623 -386 662 -500 555 -370 87 -223 742 -292 443 -794 948 -910 826 310 541 26 533 547 275 -148 743 -938 -55 -885 937 112 868 -300 43 661 255 146 -583 -645 -200 -617 464 -473 -676 -529 35 -65 83 -292 277 56 -525 698 -14 968 80 -144 418 -436 -569 73 876 -567 835 28 -856 411 603 -572 -254 -261 173 375 794 -383 -320 -59 227 930 -402 -165 -849 -749 328 -87
4
输出:999 900 743 112

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值