• leetcode 310周赛


    6176. 出现最频繁的偶数元素 - 力扣(LeetCode)

    桶思想,将所有的元素放入桶中统计,然后保存找到偶数出现次数最多是几次

    然后再遍历桶,找到第一个为偶数且次数和最大次数相同的就立马返回,如果没有找到就返回-1

    1. const int N=110000;
    2. typedef pair<int,int> PII;
    3. class Solution {
    4. public:
    5. int mostFrequentEven(vector<int>& nums) {
    6. int h[N];
    7. memset(h,0,sizeof h);
    8. for(int i=0;i<nums.size();i++)
    9. h[nums[i]]++;
    10. int maxv=0;
    11. for(int i=0;i<N;i++)
    12. {
    13. if(i%2==0)
    14. maxv=max(maxv,h[i]);
    15. }
    16. for(int i=0;i<N;i++)
    17. {
    18. if(h[i]==maxv&&i%2==0&&h[i]!=0)
    19. {
    20. return i;
    21. }
    22. }
    23. return -1;
    24. }
    25. };

    6177. 子字符串的最优划分 - 力扣(LeetCode)

    双指针,类似于最长连续不重复子序列

    1. const int N=26;
    2. class Solution {
    3. public:
    4. int partitionString(string s) {
    5. int h[N];
    6. memset(h,0,sizeof h);
    7. int res=0;
    8. for(int i=0,j=0;i<s.size();)
    9. {
    10. while(j<s.size()&&h[s[j]-'a']==0)
    11. {
    12. h[s[j]-'a']++;
    13. j++;
    14. }
    15. memset(h,0,sizeof h);//记得清空
    16. i=j;
    17. res++;
    18. }
    19. return res;
    20. }
    21. };

    6178. 将区间分为最少组数 - 力扣(LeetCode)

    这题是个原题,代码和区间分组一模一样

    遇到区间问题,第一个想法就是将左端点或者右端点排序,然后再模拟

     这题是贪心,结论就是将左端点排序,然后再创建一个小根堆,如果该区间在这个组里面且该该区间的右端点比小根堆的右端点还小的话就放入堆中

    如果发现区间没有交点就将堆顶删除再将该区间插入

    最后组的个数就说堆中元素个数

    1. const int N=110000;
    2. struct Range{
    3. int l,r;
    4. bool operator<(const Range&t)const
    5. {
    6. return l<t.l;
    7. }
    8. }rang[N];
    9. class Solution {
    10. public:
    11. int minGroups(vector<vector<int>>& intervals) {
    12. int n=intervals.size();
    13. for(int i=0;i<n;i++)
    14. rang[i]={intervals[i][0],intervals[i][1]};
    15. sort(rang,rang+n);
    16. priority_queue<int,vector<int>,greater<int>> heap;
    17. for(int i=0;i<n;i++)
    18. {
    19. auto t=rang[i];
    20. if(heap.empty()||heap.top()>=t.l)heap.push(t.r);//如果和最小的r都有交点那就新开一个组
    21. else
    22. {
    23. heap.pop();//如果发现区间没有交点就替代堆顶的位置
    24. heap.push(t.r);
    25. }
    26. }
    27. return heap.size();
    28. }
    29. };

    6206. 最长递增子序列 II - 力扣(LeetCode)

    这题是很经典的最长上升子序列问题 ,用dp的方法做的话时间复杂度是O(n^2),一看数据范围是

    10^5用dp做的话肯定会TLE,这就需要思考优化了,一开始我们学过一个优化贪心加二分能够将时间复杂度降低到O(nlogn)以内,但是这里比原来的最长上升子序列多了一个条件两个数之间只能相差k,所以不可以用二分,但是将dp的转移方程中f[i]=max(f[i],f[j]+1)中可以看出,我们要求出区间

    j到i中最长的子序列长度,从这里可以看出是区间查询问题,然后单独一个数的最长上升子序列的长度是1,也就是单点修改,由此可以看出可以用线段树或者树状数组来写,线段树的查询和修改时间复杂度是(logn)能够有效的将时间控制在O(nlogn)以内

    不过要注意的是,我们在线段树存储的区间 [l,r] 不再是原序列的下标,而是将数中的数值来作为线段树存储的区间,而查询的区间将会变成[x-k,x]查询出来就是在一个数相差不超过k的数中最长的上升子序列长度。

    1. const int N=110000;
    2. struct Node{
    3. int l,r;
    4. int v;
    5. }tr[N<<2];
    6. void push_up(int u)
    7. {
    8. tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v);
    9. }
    10. void build(int u,int l,int r)
    11. {
    12. tr[u]={l,r};
    13. if(l==r)return;
    14. int mid=l+r>>1;
    15. build(u<<1,l,mid),build(u<<1|1,mid+1,r);
    16. push_up(u);
    17. }
    18. void modfiy(int u,int x,int v)
    19. {
    20. if(tr[u].l==x&&tr[u].r==x)tr[u].v=v;
    21. else
    22. {
    23. int mid=tr[u].r+tr[u].l>>1;
    24. if(x<=mid)modfiy(u<<1,x,v);
    25. else modfiy(u<<1|1,x,v);
    26. push_up(u);
    27. }
    28. }
    29. int query(int u,int l,int r)
    30. {
    31. if (l > r) return 0;
    32. if(tr[u].l>=l&&tr[u].r<=r)return tr[u].v;
    33. int mid=tr[u].r+tr[u].l>>1;
    34. int mx=0;
    35. if(l<=mid)mx=query(u<<1,l,r);
    36. if(r>mid)mx=max(mx,query(u<<1|1,l,r));
    37. return mx;
    38. }
    39. class Solution {
    40. public:
    41. int lengthOfLIS(vector<int>& nums, int k) {
    42. int mx=0;
    43. for(int i=0;i<nums.size();i++)
    44. mx=max(mx,nums[i]);
    45. build(1,1,mx);
    46. for(auto t:nums)
    47. {
    48. int len=query(1,max(1,t-k),t-1);
    49. modfiy(1,t,len+1);
    50. }
    51. return query(1,1,mx);
    52. }
    53. };

  • 相关阅读:
    极大似然法
    数字化赋能光伏产业链供应链畅通,搭建光伏行业供应链系统加速企业转型升级
    Maven 如何打包可运行jar包
    STM32 4位数码管和74HC595
    Java 基础复习 Day 22
    Rider 2023:打造高效.NET项目的智能IDE,让开发更简单mac/win版
    Go简单实现协程池
    java毕业设计基于互联网的图书管理系统—借阅管理子模块(附源码、数据库)
    ThreadLocal源码解析 2.ThreadLocalMap内核
    C++基础——运算符
  • 原文地址:https://blog.csdn.net/qq_33269561/article/details/126806293