Leetcode - 周赛397

news2024/9/20 9:31:21

目录

一,3146. 两个字符串的排列差

二,3147. 从魔法师身上吸取的最大能量

三,3148. 矩阵中的最大得分

四,3149. 找出分数最低的排列


一,3146. 两个字符串的排列差

本题就是求同一个字符在两个字符串中的下标之差的绝对值的和,可以使用数组来统计字符的下标,再求下标之差的绝对值的和。

代码如下:

class Solution {
    public int findPermutationDifference(String s, String t) {
        int[] cnt = new int[26];
        int idx = 0;
        for(char ch : s.toCharArray()){
            cnt[ch-'a'] = idx++; 
        }
        idx = 0;
        int ans = 0;
        for(char ch : t.toCharArray()){
            ans += Math.abs(cnt[ch-'a']-idx++);
        }
        return ans;
    }
}

二,3147. 从魔法师身上吸取的最大能量

本题实际上就是把energy数组分成k段,求每一段中连续子数组的最大值(开始位置随便,结束位置必须是这一段的结尾),所以可以枚举每一段的结束位置,倒着往前遍历,求最大值,有点像希尔排序。画个图理解一下:

代码如下:

class Solution {
    public int maximumEnergy(int[] energy, int k) {
        int n = energy.length;
        int ans = Integer.MIN_VALUE;
        for(int i=n-1; i>=n-k; i--){
            int res = 0;
            for(int j=i; j>=0; j-=k){
                res += energy[j];
                ans = Math.max(res, ans);
            }
        }
        return ans;
    }
}

三,3148. 矩阵中的最大得分

写本题前有一点要注意到:A -> B -> C 的得分和 A -> C 的得分是一样的,也就是说,只需要关注起点和终点的差就行,即只需要找到NxM的矩阵中的子矩形它的 终点 - 起点 最大就行。

所以这题就有点类似于求二维前缀和,只不过这里是求二维最小值f[i][j],而答案就是 g[i][j] - Math.min( f[i-1][j],f[i][j-1]),中的最大值

注意:题目要求必须移动一次,所以不能使用 g[i][j] - f[i][j] 来求最大值,可能出现原地不动的情况

class Solution {
    //f[i+1][j+1]:表示(0,0)->(i,j)这个矩阵的最小值
    public int maxScore(List<List<Integer>> grid) {
        int n = grid.size(), m = grid.get(0).size();
        int[][] f = new int[n+1][m+1];
        for(int i=0; i<n+1; i++) f[i][0] = Integer.MAX_VALUE;
        for(int j=0; j<m+1; j++) f[0][j] = Integer.MAX_VALUE;
        int ans = Integer.MIN_VALUE;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                f[i+1][j+1] = Math.min(f[i+1][j], f[i][j+1]);
                ans = Math.max(ans, grid.get(i).get(j) - f[i+1][j+1]);
                f[i+1][j+1] = Math.min(f[i+1][j+1], grid.get(i).get(j));
            }
        }
        return ans;
    }
}

四,3149. 找出分数最低的排列

按照暴力的思路来看,枚举[0,.....,n]的所有排列顺序,(之前使用过的后面就不能再次使用),计算出其中分数最低且字典序最小的排序。所以使用 dfs 需要两个参数,一个是之前已使用过的数(这是无序的,只有相邻的数才会对分数产生影响),二是当前位置的前一个数(这是为了计算它的分数)。

  • dfs(i,j):表示在选择过 i 集合(使用二进制来表示集合)中的数,且前一个数为 j 的最低的分数。
  • 从小到大枚举下一个可以选择的数 k,res = Math.max( res, dfs(i|1<<k, k) + Math.abs( k - nums[k]) )
  • 当所有的数都选过之后,直接 return Math.abs(j - nums[0])

起始位置一定可以等于 0:实际上这里只要 perm[i] 与 nums[perm[i+1]] 的对应关系不变,起始位置可以是任何数,只不过题目要求字典序最小,所以这里起始位置为 0。画个图理解一下:

另外一点,题目不是要求返回最小值,而是要返回perm数组,所以还需要多写一步,获取perm数组的方法直接看代码注释。

代码如下:

class Solution {
    int[] nums;
    int n;
    int[][] memo;
    public int[] findPermutation(int[] nums) {
        this.n = nums.length;
        this.nums = nums;
        memo = new int[1<<14][14];
        for(int[] row : memo)
            Arrays.fill(row, -1);
        int[] ans = new int[n];
        print_dfs(1, 0, ans, 0);//1:表示集合中有0
        return ans;
    }
    int dfs(int i, int j){
        if(i == (1<<n)-1){
            return Math.abs(j-nums[0]);
        }
        if(memo[i][j]!=-1) return memo[i][j];
        int res = Integer.MAX_VALUE;
        for(int x=1; x<n; x++){//枚举可取的数
            if((i>>x&1)==0)//该数没有被选择过
                res = Math.min(res, dfs(i|1<<x, x) + Math.abs(j - nums[x]));
        }
        return memo[i][j] = res;
    }
    void print_dfs(int i, int j, int[] ans, int idx){
        ans[idx] = j;//记录数组
        if(i == (1<<n)-1){
            return;
        }
        int final_ans = dfs(i, j);//找到(i,j)最小的值
        for(int x=1; x<n; x++){//从小到大遍历,确保字典序最小
            if((i>>x&1)==1)
                continue;
            if(final_ans == dfs(1<<x|i, x) + Math.abs(j-nums[x])){//如果值相同,说明当前数选择的就是x
                print_dfs(i|1<<x, x, ans, idx+1);
                break;
            }
        }
    }
}

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

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

相关文章

网页版Figma汉化

最近学习Figma&#xff0c;简单介绍一下网页版Figma的汉化方法 1.打开网址&#xff1a;Figma软件汉化-Figma中文版下载-Figma中文社区 2.下载汉化插件离线包 解压汉化包 3.点开谷歌的管理扩展程序 4.点击加载已解压的扩展程序&#xff0c;选择刚刚解压的包 这样就安装好了汉化…

stm32ADC注入通道使用笔记(以STM32F407 为例)

ADC_JDR1 存放的是第一次转换的数据 ADC_JDR2 存放的是第二次转换的数据 ADC_JDR3 存放的是第三次转换的数据 ADC_JDR4 存放的是第四次转换的数据 1.当 JL 0&#xff08;定序器中有 1 次注入转换&#xff09;时&#xff0c;ADC 将仅转换 JSQ4[4:0] 通道。值存入ADC_JDR1中…

dfs记忆化搜索,动态规划

动态规划概念&#xff1a; 给定一个问题&#xff0c;将其拆成一个个子问题&#xff0c;直到子问题可以直接解决。然后把子问题的答案保存起来&#xff0c;以减少重复计算。再根据子问题的答案反推&#xff0c;得出原问题解。 821 运行时间长的原因&#xff1a; 重复大量计算…

IT革新狂潮:引领未来的技术趋势

方向一&#xff1a;技术革新与行业应用 当前现状&#xff1a; 量子计算&#xff1a;量子计算的研究正在加速&#xff0c;尽管目前仍处于初级阶段&#xff0c;但其在药物研发、加密技术和材料科学等领域的应用潜力已被广泛认可。 虚拟现实&#xff08;VR&#xff09;与增强现实…

算法学习笔记(5.0)-基于比较的高效排序算法-归并排序

##时间复杂度O(nlogn) 目录 ##时间复杂度O(nlogn) ##递归实现归并排序 ##原理 ##图例 ##代码实现 ##非递归实现归并排序 ##释 #代码实现 ##递归实现归并排序 ##原理 是一种基于分治策略的基础排序算法。 1.划分阶段&#xff1a;通过不断递归地将数组从中点处分开&…

python之pyQt5实例:树莓派+MPU6050采集数据

1、安装必要的软件包&#xff1a; sudo apt-get update sudo apt-get install python3-smbus python3-dev i2c-tools sudo apt-get install python3-smbus 2、确认I2C接口已经启用&#xff1a; 运行 sudo raspi-config 命令打开Raspberry Pi配置工具。 在菜单中选择 "…

ThreadLocal,一次到位

一、定义 ThreadLocal是线程私有变量&#xff0c;用于保存每个线程的私有数据。 那么什么情况下需要进行线程隔离 二、源码分析 public class ThreadLocalTest01 {ThreadLocal<Integer> t new ThreadLocal<>();public void test() {t.set(1);Integer integer…

如果你还不了解双亲委派模型,来看看这篇吧

文章首发于【Java天堂】&#xff0c;跟随我探索Java进阶之路&#xff01; 类与类加载器 类是由它的类加载器加载进虚拟机中的&#xff0c;在同一个Java虚拟机中&#xff0c;对于同一个Class文件&#xff0c;如果采用不同的类加载器&#xff0c;得到的是不相等的类&#xff0c;…

k8s二进制部署--多master、负载均衡、高可用

目录 1、环境准备 1.1 服务器配置 1.2 master02 节点部署 2、负载均衡部署 2.1 下载nginx 2.2 修改nginx配置文件 2.3 启动nginx 2.3.1 检查配置文件语法 2.3.2 启动nginx服务&#xff0c;查看已监听6443端口 3. 部署keepalived服务(nginx主机&#xff0c;以nginx01为…

十一.吊打面试官系列-JVM优化-深入JVM类加载机制

前言 从本篇文章开始我们来探讨JVM相关的知识&#xff0c;内容附带JVM的启动&#xff0c;JVM内存模型&#xff0c;JVM垃圾回收机制&#xff0c;JVM参数调优等&#xff0c;跟着文章一步一步走相信你对JVM会有一个不一样的认识&#xff0c;如果觉得文章对你有所帮助请给个好评吧…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 驾校管理系统 设计与实现

一.项目介绍 系统角色&#xff1a;管理员、驾校教练、学员 管理员&#xff1a; 个人中心&#xff1a;修改密码以及个人信息修改 学员管理&#xff1a;维护学员信息&#xff0c;维护学员成绩信息 驾校教练管理&#xff1a;驾校教练信息的维护 驾校车辆管理&…

水离子雾化壁炉与会所房间的氛围搭配

水离子雾化壁炉在会所房间的氛围搭配可以为房间增添舒适、温馨和现代感&#xff0c;以下是一些建议&#xff1a; 主题定位&#xff1a; 根据会所房间的主题和定位选择合适的水离子雾化壁炉款式和设计风格。可以是现代简约、欧式古典或是豪华奢华&#xff0c;确保与房间整体风格…

Java基础学习笔记二

Java基础学习笔记二 6 File1.File类1.1File类概述和构造方法【应用】1.2File类创建功能【应用】1.3File类判断和获取功能【应用】1.4File类删除功能【应用】 2.递归1递归【应用】2递归求阶乘【应用】3递归遍历目录【应用】 3.IO流1 IO流概述和分类【理解】2字节流写数据【应用】…

HL7协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.介绍2.传输协议规范2.1. MLLP2.1.1. 数据头定义2.1.2. 转义字符集 2.2. 规范说明2.3. 消息格式说明 3.HL7结构介绍3.1. 患者建档&#xff08;ADT^A28&#xff09;…

AI应用之智能体介绍

AI应用之智能体介绍 一、LLM介绍二、智能客服应用1&#xff0c;阿里智能能话机器人2&#xff0c;华为对话机器人3&#xff0c;公司基于讯飞知识库和讯飞大模型的智能客服 三、大模型应用平台介绍1&#xff0c;fastgpt2&#xff0c;毕昇3&#xff0c; 字节海外版&#xff08;科学…

学习Nginx(二):版本介绍和安装

版本 Nginx官方定义了Mainline、Stable、Legacy三种版本。 1. Mainline version&#xff08;主线版本&#xff09; 该版本包含最新的功能和bug修复&#xff0c;被视为开发版&#xff0c;即正在活跃开发中的版本。其版本号通常为单数&#xff0c;例如1.25.5。这个版本的更新较快…

Nvidia Jetson编译安装Opencv With CUDA,完善GSTREAMER功能

简介 Nvidia Jetson 官方刷机流程结束以后&#xff0c;虽然安装了opencv&#xff0c;但是此版本是CPU版本&#xff0c;并且不包含Cpp版本。如果想要完整的OpenCV支持&#xff0c;需要从源码编译。本文介绍如何下载编译&#xff0c;并安装OPENCV库&#xff0c;并获得完整的CUDA…

必应bing广告开户费用介绍,必应搜索广告推广开户服务!

微软必应Bing搜索引擎广告成为了企业提升品牌知名度与市场份额的有效途径之一&#xff0c;作为全球第二大搜索引擎&#xff0c;在中国市场正逐步展现出其独特的广告价值与潜力。对于希望拓展在线市场的中国企业而言&#xff0c;通过云衔科技开启必应Bing国内广告推广之旅&#…

谷歌外贸seo优化怎么做?

一般有两种选择&#xff0c;在大型电商平台开展业务&#xff0c;如亚马逊&#xff0c;阿里巴巴等平台&#xff0c;也可以选择搭建自己的独立站 选择在大型电商平台可以方便迅速建立起自己的商铺&#xff0c;不需要考虑太多交易&#xff0c;支付&#xff0c;物流等方面的问题&am…

2024.05.14 Diffusion 代码学习笔记

配环境 我个人用的是Geowizard的环境&#xff1a;https://github.com/fuxiao0719/GeoWizard。 出于方便考虑&#xff0c;用的pytorch官方的docker容器&#xff0c;因此python版本&#xff08;3.10&#xff09;和原作者&#xff08;3.9&#xff09;不同&#xff0c;其余都是一…