IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【力扣】第 280 场力扣周赛复盘 -> 正文阅读

[数据结构与算法]【力扣】第 280 场力扣周赛复盘

  • 👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,Java领域新星创作者
  • 📝个人公众号:爱敲代码的小黄
  • 📕系列专栏:Java设计模式、数据结构和算法
  • 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
  • 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
  • 🍂博主正在努力完成2022计划中:以梦为马,扬帆起航,2022追梦人

一、引言

今天的周赛打的一言难尽,由于一个简单的 long 转换疏忽导致自己 T3 没A

二、 6004. 得到 0 的操作数

1、题目简介

在这里插入图片描述

2、题目解析

  • 模拟即可
  • 注意返回的条件:while(num1 != 0 && num2 != 0)

3、题目代码

class Solution {
    public int countOperations(int num1, int num2) {
        int count = 0;
        while(num1 != 0 && num2 != 0){
            if(num1 >= num2){
                num1 = num1 - num2;
            }else{
                num2 = num2 - num1;
            }
            count++;
        }
        return count;
    }
}

三、6005. 使数组变成交替数组的最少操作数

1、题目简介

在这里插入图片描述

2、题目解析

  • 贪心
  • 我们分析题目,简单的来讲,最后的结果:我们奇数位是同一个数字,偶数位是同一个数字,并且数字不能相等
  • 我们使用两个优先队列存储其次数,根据 出现最多的次数 进行判断
  • 我们考虑以下几种情况:
    • [0]:队列二为空
    • [1,2]:队列一和队列二大小均为1
    • [1,2,3]:队列一大小为2,队列二大小为1
    • [1,2,3,4]:队列一大小为2,队列二大小为2
  • 我们比较优先队列的 int value = peek() ,数字出现的次数
    • 如果不相等的话,说明最终都需要变成 value,计算其次数即可
    • 如果相等的话,我们需要比较 value 的大小,大的保持原状,小的需要变成 第二大的

3、题目代码

class Solution {
    public static int minimumOperations(int[] nums) {
        if (nums.length == 1) {
            return 0;
        }
        HashMap<Integer, Integer> map1 = new HashMap<>();
        HashMap<Integer, Integer> map2 = new HashMap<>();
        int count1 = 0;
        int count2 = 0;
        for (int i = 0; i < nums.length; i++) {
            if (i % 2 != 0) {
                count1++;
                map1.put(nums[i], map1.getOrDefault(nums[i], 0) + 1);
            } else {
                count2++;
                map2.put(nums[i], map2.getOrDefault(nums[i], 0) + 1);
            }
        }
        // 奇数
        PriorityQueue<int[]> priorityQueue1 = new PriorityQueue<>(new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o2[1] - o1[1];
            }
        });
        for (Integer key : map1.keySet()) {
            priorityQueue1.add(new int[]{key, map1.get(key)});
        }
        // 偶数
        PriorityQueue<int[]> priorityQueue2 = new PriorityQueue<>(new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o2[1] - o1[1];
            }
        });
        for (Integer key : map2.keySet()) {
            priorityQueue2.add(new int[]{(int) key, (int) map2.get(key)});
        }
        if (priorityQueue1.size() == 1 && priorityQueue2.size() == 1) {
            if (priorityQueue1.peek()[0] != priorityQueue2.peek()[0]) {
                return 0;
            } else {
                return priorityQueue1.peek()[1] >= priorityQueue2.peek()[1] ? priorityQueue2.peek()[1] : priorityQueue1.peek()[1];
            }
        }else if (priorityQueue1.size() > 1 && priorityQueue2.size() == 1) {
            if (priorityQueue1.peek()[0] != priorityQueue2.peek()[0]) {
                return count1 - priorityQueue1.peek()[1];
            } else {
                if (priorityQueue1.peek()[1] >= priorityQueue2.peek()[1]) {
                    return count2 + count1 - priorityQueue1.peek()[1];
                } else {
                    priorityQueue1.poll();
                    return count1 - priorityQueue1.peek()[1];
                }
            }
        } else {
            if (priorityQueue1.peek()[0] != priorityQueue2.peek()[0]) {
                return count1 - priorityQueue1.peek()[1] + count2 - priorityQueue2.peek()[1];
            } else {
                if (priorityQueue1.peek()[1] >= priorityQueue2.peek()[1]) {
                    priorityQueue2.poll();
                    return count1 - priorityQueue1.peek()[1] + count2 - priorityQueue2.peek()[1];
                } else {
                    priorityQueue1.poll();
                    return count1 - priorityQueue1.peek()[1] + count2 - priorityQueue2.peek()[1];
                }
            }
        }
    }
}

四、6006. 拿出最少数目的魔法豆

1、题目简介

在这里插入图片描述

2、题目解析

  • 我们发现,我们要想使魔法豆相等,需要找到一个临界点,根据这个临界点:小于他的全部变成0,大于他的全部变成成它
  • 先进行排序
  • 我们以 [1,4,5,6] 作为例子
    • 假设当前的临界点为5,那么我们的 1、4 需要变为 06 变成 5,最后的结果为:7
    • 由于我们的魔法豆没办法增加,只能减少
    • 当我们遍历其数值时,我们将整体的和 - 后面的数据个数 * 当前的值
      在这里插入图片描述
    • 注意,我们在求值的时候,千万不要忘了将类型转为 long
    • 这个题目也可以使用 前缀和

3、题目代码

class Solution {
   public long minimumRemoval(int[] beans) {
        int len = beans.length;
        Arrays.sort(beans);
        long sum = 0;
        for(int i = 0; i < len; i++){
            sum = sum + beans[i];
        }
        long minSum = Long.MAX_VALUE;
        for(int i = 0; i < len; i++){
        	// 注意转为long
            minSum = Math.min(minSum, sum - (len - i) * (long)beans[i]);
        }
        return minSum;
    }
}

五、总结

这次的周赛成绩还是不理想,希望下次的周赛成绩更好一点~
下一次一定注意类型的转换
加油加油~~~

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-14 21:25:47  更:2022-02-14 21:25:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:23:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码