Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

    • 394.字符串解码
    • 32. 最长有效括号
    • 739. 每日温度
    • 1130. 叶值的最小代价生成树
    • 84. 柱状图中最大的矩形
    • 42.接雨水
    • 85. 最大矩形
    • 239.滑动窗口最大值
    • 6891. 机器人碰撞
    • 445. 两数相加 II
    • 2762. 不间断子数组
    • 6919. 使数组中的所有元素都等于零
    • 862. 和至少为 K 的最短子数组
    • 1499. 满足不等式的最大值
    • 2856. 删除数对后的最小数组长度
      • 1.优先级队列
      • 2.二分思路
    • 901. 股票价格跨度
    • 2034. 股票价格波动
    • 1488. 避免洪水泛滥
    • 2940. 找到 Alice 和 Bob 可以相遇的建筑
    • 2454. 下一个更大元素 IV
  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 堆栈队列
phan
2023-09-26
目录

2856. 删除数对后的最小数组长度

# 2856. 删除数对后的最小数组长度 (opens new window)

# 1.优先级队列

解题思路:考虑用例3,3,3,4,4,4,4,5,5,5。可以发现要想保证剩余数组最小,对所选择作为删除数对的数的频次有一定的要求,题目已经保证数组有序,因此频次越多的数需要优先和其它的数进行消除。具体的,每次需要选择频次最多的两个数作为删除的数对。

维护一个小顶堆,队首元素为出现频次最大的元素。时间复杂度为O(n)

class Solution {
    public int minLengthAfterRemovals(List<Integer> nums) {
        Map<Integer,int[]> map=new HashMap<>();
        PriorityQueue<int[]> queue=new PriorityQueue<>(new Comparator<int[]>(){
            public int compare(int[] o1,int[] o2){
                return o2[1]-o1[1];
            }
        });
        int res=nums.size();
        for(int i=0;i<nums.size();i++){
            if(!map.containsKey(nums.get(i))){
                int[] tmp=new int[]{nums.get(i),1};
                map.put(nums.get(i),tmp);
            }
            else{
                map.get(nums.get(i))[1]++;
            }
        }
        for (int[] value : map.values()) {
            queue.offer(value);
        }
        while(queue.size()>1){
            int[] tmp1=queue.poll();
            int[] tmp2=queue.poll();
            tmp1[1]--;
            tmp2[1]--;
            if(tmp1[1]>0)queue.offer(tmp1);
            if(tmp2[1]>0)queue.offer(tmp2);
            res-=2;
        }
        return res;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 2.二分思路

假设某个数达到最大出现频次cnt,分类讨论cnt*2与n的大小关系。

题目转换为求出cnt,在有序数组中可以使用二分的方法找到最大频次的数的首尾索引坐标。

编辑 (opens new window)
#Leetcode#堆栈队列
上次更新: 2023/12/15, 15:49:57
1499. 满足不等式的最大值
901. 股票价格跨度

← 1499. 满足不等式的最大值 901. 股票价格跨度→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式