Leetcode - 135双周赛

news2024/11/15 14:07:54

目录

一,3222. 求出硬币游戏的赢家

二,3223. 操作后字符串的最短长度

三,3224. 使差值相等的最少数组改动次数

四,3225. 网格图操作后的最大分数


一,3222. 求出硬币游戏的赢家

本题就是一道模拟题,每个人每次只能拿走1枚价值为75的硬币和4枚价值为10的硬币,代码如下:

class Solution {
    public String losingPlayer(int x, int y) {
        int t = -1;
        while(x >= 1 && y >= 4){
            x -= 1;
            y -= 4;
            t *= -1;
        }
        return t==-1?"Bob":"Alice";
    }
}

//进阶版本
class Solution {
    public String losingPlayer(int x, int y) {
        int min = Math.min(x, y/4);
        return min%2==0?"Bob":"Alice";
    }
}

二,3223. 操作后字符串的最短长度

本题求字符串s的最短长度,我们可以先统计每个字符出现的次数,然后暴力,计算出每一个字符最终剩下的次数。题目中所说的删除,实际上是说,如果一个字符出现次数 >= 3,那么可以将其减去2,直到该字符出现次数 < 3。

代码如下:

class Solution {
    public int minimumLength(String s) {
        int[] cnt = new int[26];
        for(char c : s.toCharArray()){
            cnt[c-'a']++;
        }
        int ans = 0;
        for(int x : cnt){
            while(x >= 3){
                x -= 2;
            }
            ans += x;
        }
        return ans;
    }
}

//简化循环版本
class Solution {
    public int minimumLength(String s) {
        int[] cnt = new int[26];
        for(char c : s.toCharArray()){
            cnt[c-'a']++;
        }
        int ans = 0;
        for(int x : cnt){
            if(x > 0)
                ans += x%2==0?2:1;
        }
        return ans;
    }
}

三,3224. 使差值相等的最少数组改动次数

本题如果使用暴力的话,我们可以枚举X的值,再求出将每个差值变成X所需要的最小操作次数,需要知道对于每对(nums[i],nums[n-i-1]),它们什么时候需要操作0次,1次,2次。分情况讨论,(令 p = nums[i],q = nums[n-i-1] 且 p < q):

  • q - p = X,操作 0 次
  • q - p > X,操作 1 次
  • q - p < X && max(q,k-p) >= X,操作 1 次
  • q - p < X && max(q,k-p) < X,操作 2 次

注:max(q,k-p)表示如果只修改1次,那么X的值只能在[0,max(q,k-p)],否则必须要修改2次

为了简化时间复杂度,我们可以进行预处理,使得在枚举X时可以直接得出对于所有(p,q)的差值变成X需要操作的次数。这里有两种做法:

  • 可以使用两个数组,分别统计不需要操作的对数,以及需要操作两次的对数。枚举每一对(p,q),cnt1[q-p]+=1,即如果X=q-p,那么这对数不需要操作;cnt2[max(q,k-q)]+=1,即对于(p,q)如果只能操作1次,那么X最多只能到max(q,k-q),只要X>max(q,k-q),那么这对数就必须要操作两次。得到上述两个数组后,枚举X,最终所需要的操作数就是 n/2 - cnt1[X] + (cnt2[0] + ... + cnt2[X-1])
class Solution {
    public int minChanges(int[] nums, int k) {
        int n = nums.length;
        int[] cnt1 = new int[k+1];
        int[] cnt2 = new int[k+1];
        for(int i=0; i<n/2; i++){
            int x = nums[i], y = nums[n-i-1];
            int mn = Math.min(x, y);
            int mx = Math.max(x, y);
            cnt1[mx-mn] += 1;
            cnt2[Math.max(mx, k-mn)] += 1;
        }   
        int ans = n, pre = 0;
        for(int x=0; x<=k; x++){
            //cnt1[x]:表示刚好等于x,不用修改
            //n/2-cnt1[x]:表示至少需要修改一次的(p,q)数量
            //pre:表示需要修改两次的(p,q)数量
            ans = Math.min(ans, n/2-cnt1[x]+pre);
            pre += cnt2[x];
        }
        return ans;
    }
}
  • 差分数组,简单来说差分数组就是使用简单的操作来实现一段区域内数字的同增或同减,支持所有操作完成后再查询;不支持边操作边查询;
  • 对于本题来说,对于每对(p,q),令 x = p-q,如果X属于[0,x-1],那么需要操作一次,要将[0,x-1]区域全部加1;如果X属于[x+1,mx],也只需要操作一次,要将[x+1,mx]区域全部加1;如果X属于[mx+1,k],那么需要操作2次,要将[mx+1,k]区域全部加2
  • 如果要计算每个X对应的操作次数,就是算差分数组的前缀和
class Solution {
    public int minChanges(int[] nums, int k) {
        int n = nums.length;
        int[] d = new int[k+2];
        for(int i=0; i<n/2; i++){
            int p = nums[i], q = nums[n-i-1];
            if(p > q){
                int t = p;
                p = q;
                q = t;
            }
            int x = q - p;
            int mx = Math.max(q, k-p);
            //[0, x-1]范围所有数 +1
            d[0]++;
            d[x]--;
            //[x+1, mx]范围所有数 +1
            d[x+1]++;
            d[mx+1]--;
            //[mx+1, k]范围所有数 +2
            d[mx+1]+=2;
        }   
        int ans = n, pre = 0;
        for(int v : d){
            pre += v;
            ans = Math.min(ans, pre);
        }
        return ans;
    }
}

四,3225. 网格图操作后的最大分数

本题讲O(n^4)的解法,我们可以将原问题转换成一个与原问题相同的子问题,原问题:求 j 列网格图的最大分数;子问题:在知道最后一列黑格子的高度后,那么剩下的就是求 j-1 列网格图的最大分数,依次类推....

我们要求当前第 j 列所能得到的分数,必须要知道第 j+1 列和 j-1 列的黑格子的高度,所以可以这样定义dfs(j,cur,pre):在第 j 列黑格子高度为 cur,第 j+1 列黑格子高度为 pre 时,[0,j]列网格图的最大分数。还剩下第 j-1 列黑格子的高度,我们可以在dfs中枚举。

代码如下:

class Solution {
    public long maximumScore(int[][] grid) {
        int n = grid.length;
        long[][] preSum = new long[n+1][n];//每列的前缀和
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                preSum[i+1][j] = preSum[i][j] + grid[i][j];
            }
        } 
        memo = new long[n+1][n+1][n+1];
        for(int i=0; i<n+1; i++){
            for(int j=0; j<n+1; j++){
                Arrays.fill(memo[i][j], -1);
            }
        }
        long ans = 0;
        //枚举n-1列的高度
        for(int i=0; i<=n; i++){
            ans = Math.max(ans, dfs(n-1,i,0,preSum));
        }
        return ans;
    }
    long[][][] memo;
    //dfs(j列, j列的高度, j+1列的高度)
    long dfs(int j, int cur, int pre, long[][] preSum){
        if(j == 0) return pre > cur ? preSum[pre][0]-preSum[cur][0]:0;
        if(memo[j][cur][pre] != -1) return memo[j][cur][pre];
        int n = preSum.length-1;
        long res = 0;
        //枚举j-1列的高度
        for(int nxt=0; nxt<=n; nxt++){
            long s = Math.max(nxt, pre) > cur ? preSum[Math.max(nxt,pre)][j]-preSum[cur][j] : 0;
            res = Math.max(res, dfs(j-1,nxt,cur,preSum)+s);
        }
        return memo[j][cur][pre] = res;
    }
}

在此贴一个O(n^3)的解法:

class Solution {
    public long maximumScore(int[][] grid) {
        int n = grid.length;
        long[][] preSum = new long[n+1][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                preSum[i+1][j] = preSum[i][j] + grid[i][j];
            }
        } 
        memo = new long[n+1][n+1][2];
        for(int i=0; i<n+1; i++){
            for(int j=0; j<n+1; j++){
                Arrays.fill(memo[i][j], -1);
            }
        }
        long ans = 0;
        //枚举n-1列的高度
        for(int i=0; i<=n; i++){
            ans = Math.max(ans, dfs(n-2,i,0,preSum));
        }
        return ans;
    }
    long[][][] memo;
    //dfs(j列, j+1列的高度, j+1列的高度 < j+2列的高度)
    long dfs(int j, int pre, int dec, long[][] preSum){
        if(j < 0) return 0;
        if(memo[j][pre][dec] != -1) return memo[j][pre][dec];
        int n = preSum.length-1;
        long res = 0;
        //枚举j-1列的高度
        for(int cur=0; cur<=n; cur++){
            if(cur == pre){
                res = Math.max(res, dfs(j-1,cur,0,preSum));
            }else if(cur < pre){
                res = Math.max(res, dfs(j-1,cur,1,preSum)+preSum[pre][j]-preSum[cur][j]);
            }else if(dec == 0){
                res = Math.max(res, dfs(j-1,cur,0,preSum)+preSum[cur][j+1]-preSum[pre][j+1]);
            }else if(pre == 0){
                res = Math.max(res, dfs(j-1,cur,0,preSum));
            }
        }
        return memo[j][pre][dec] = res;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue自写组件可输入,可下拉选择,因为el-autocomplete数据多了会卡

<!-- 引入组件 --><AutoCompletev-model"scope.row.strreceivername":lngemployeeid"scope.row.lngreceiverid"select"handleSelect($event,scope.row)"/> methods:{handleSelect(item, row) {row.lngreceiverid item.lngemployeei…

NC 删除有序链表中重复的元素-II

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给出一个升序…

复杂系统科学之钥——从简单交互到宏观行为的涌现公式

复杂系统科学之钥——从简单交互到宏观行为的涌现公式 简单交互与宏观行为的类比 你可以把简单交互比作“音符”&#xff0c;而宏观行为就像是“乐章”&#xff0c;复杂系统科学就是研究如何从众多音符演奏出美妙乐章的学问。 复杂系统科学的核心作用 组件/步骤描述简单交互个…

这可能是开源界最好用的能源管理系统

&#x1f482; 个人网站: IT知识小屋&#x1f91f; 版权: 本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 写在前面项目简介项目特点项目架构模块展示项目获取 写在前面 大…

为什么日本的就业率那么高?原因是什么?

数据显示&#xff0c;2024年&#xff0c;日本大学生就业为98.1%&#xff0c;是自1997年以来的最高水平。不是说日本经济快崩了嘛&#xff0c;怎么就业率会如此高呢&#xff1f; 其中最主要的原因还是与就业率的统计有关。 有网友说&#xff0c;在日本工作&#xff0c;主要分为…

企知道 接口逆向:AES加密

&#x1f510; 登录接口逆向 &#x1f575;️ 抓包登录接口 使用抓包工具捕获企知道的登录接口请求&#xff0c;观察到密码参数是加密的密文&#xff0c;传输给后端服务器。 &#x1f9e9; 跟栈到密码加密位置 通过浏览器开发者工具&#xff0c;跟踪JS代码栈&#xff0c;找…

什么是数据中台?从哪些方面加深对数据中台的认知?需要理清些什么概念?数据中台的意义是什么?

目录 一、数据中台的产生与发展 1.1 脱胎于大数据的发展 1.2 概念诞生于中国 二、数据中台的定义 2.1 概述 2.2 定义一 2.2 定义二 2.3 定义三 2.4 定义四 2.5 定义五 2.6 我对数据中台的解读 三、对数据中台的认知 3.1 概述 3.2 数据中台需要提升战略高度&#x…

Python学习笔记47:游戏篇之外星人入侵(八)

前言 在上篇文章中&#xff0c;我们在游戏窗口中加载三行外星人。文章中也说过我们加载外星人的方式是比较简单的加载方式&#xff1a;一次性加载固定数量的外星人&#xff0c;并且以同样的方式重复加载。这种加载方式简单易懂&#xff0c;比较适合新手&#xff0c;如果想要一…

c++----日期类

今天这篇博客是对我们上面的两篇博客的一个小小的检验。我们今天来实现一下我们手机上的一个小功能。对日期的实现。那么如何实现以及使用哪些知识&#xff0c;我们马上来看看吧。 思想概括 其实实现日期类并不是什么难事。如果用c语言的话大家可能会觉得很简单&#xff0c;主…

【VS Code】我用到的一些VS Code插件和命令

【命令】 打开终端&#xff1a; Ctrl ~ 【插件】 材质图标主题插件&#xff1a;Material Icon Theme 让文件图标看起来更美丽

yandex图标点选验证码YOLOV8识别案例

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 某yandex图标点选验证码如下: 使用过yolov8的小伙伴可能都知道,这种直接打个标注,基本上就可以了,至于问题图片由于不能很好的切割做分类,所以干脆也做成目标…

还在用JVM跑你的Java代码吗?太慢了,试试Oracle的GraalVM吧

前言 对于Java开发者们来说&#xff0c;几乎每天都在和JVM打交道&#xff0c;然而JVM即将过时了。那些对新技术保持敏锐洞察力的开发者&#xff0c;可能已经在生产环境中部署GraalVM生成的二进制程序了&#xff0c;小伙伴们&#xff0c;你们已经用起来了吗&#xff1f; Graal…

AOP~面向切面编程介绍

AOP基础 概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;面向特定方法的编程。 动态代理是面向切面编程最主流的实现。 SpringAOP是Spring框架的高级技术&#xff0c;旨在管理bean对象的过程中&#xff0c…

【基础篇】Docker 架构与组件 TWO

嗨&#xff0c;小伙伴们&#xff01;我是小竹笋&#xff0c;一名热爱创作的工程师。上一篇我们聊了聊 Docker 的历史与发展、与虚拟机的对比以及它在行业中的应用。今天&#xff0c;让我们更进一步&#xff0c;深入探讨 Docker 的架构与关键组件。 欢迎订阅公众号&#xff1a;…

Fantastic-admin:Vue 中后台管理系统

Fantastic-admin&#xff1a;Vue 中后台管理系统 在当今的前端开发世界里&#xff0c;fantastic-admin 作为一款功能强大的 Vue 中后台管理系统框架&#xff0c;简直是开发者的福音。本文将介绍 fantastic-admin 的基本信息、特点&#xff0c;以及如何快速上手和使用。 项目简介…

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践

7月12日&#xff0c;第13届PostgreSQL中国技术大会在杭州顺利举办&#xff0c;亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上&#xff0c;亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲&#xf…

AWS资源购买和使用:亚马逊云显示配额不足怎么解决

亚马逊云显示配额不足是许多AWS用户在使用云服务时可能遇到的常见问题。这种情况通常发生在用户试图启动新的EC2实例或扩展现有资源时&#xff0c;系统提示已达到特定资源类型的限制。本文中九河云将跟你们一起探讨这一问题的原因及其解决方案。 首先&#xff0c;了解AWS配额的…

最便宜的iPhone SE 4要来,配置爆炸但砍了灵魂

前几天乐视刚刚发布了「低配青春 AIR 版 iPhone SE 4」&#xff0c;电友们就坐不住了&#xff0c;纷纷问真 iPhone SE 4 究竟什么时候才能来。 阿红也去挖了一下情报&#xff0c;别说&#xff0c;还真在路上了。 众所周知&#xff0c;最近一代&#xff0c;也就是第三代 iPhone…

Liquibase 增加一列主键,自动生成 UUID:最佳实践与深度解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 自动生成 UUID UUID 是一种全局唯一的标识符&#xff0c;通常由 32 个十六进制数字组成&#xff0c;分为五组&#xff0c;形式如下&#xff1a; 123e4567-e89b-12d3-a456-426614174000在 Java 中&#xff0c;可以使…

从零开始写 Docker(十九)---增加 cgroup v2 支持

本文为从零开始写 Docker 系列第十九篇&#xff0c;添加对 cgroup v2 的支持。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原理&#xff1a;深入理解 Docker 核心原理&#xff1a…