Leetcode - 周赛422

news2024/11/24 15:32:33

目录

一,3340. 检查平衡字符串

二,3341. 到达最后一个房间的最少时间 I

三,3342. 到达最后一个房间的最少时间 II

四,3343. 统计平衡排列的数目


一,3340. 检查平衡字符串

本题直接暴力,定义一个变量 s,如果是偶数下标就 + ,反之则 - 。最后判断 s == 0。

代码如下:

class Solution {
    public boolean isBalanced(String num) {
        char[] ch = num.toCharArray();
        int s = 0;
        for(int i=0; i<ch.length; i++){
            if(i%2==0){
                s += ch[i]-'0';
            }else{
                s -= ch[i]-'0';
            }
        }
        return s == 0;
    }
}

二,3341. 到达最后一个房间的最少时间 I

本题直接使用dijkstra算法(不知道原理的可以看这篇博客Leetcode - 128双周赛),唯一需要注意的点是如何计算它到一个地点所需要的时间,题目要求如果要从(i,j)移动到(x,y),那么移动前即在(i,j)时的时间一定要大于等于 moveTime[x][y]

代码如下:

class Solution {
    int[][] dirct = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
    public int minTimeToReach(int[][] move) {
        PriorityQueue<int[]> que = new PriorityQueue<>((x, y)->x[2]-y[2]);
        que.offer(new int[]{0, 0, 0});
        int n = move.length, m = move[0].length;
        int[][] vis = new int[n][m];
        for(int i=0; i<n; i++) Arrays.fill(vis[i], Integer.MAX_VALUE);
        vis[0][0] = 0;
        while(!que.isEmpty()){
            int[] t = que.poll();
            if(t[2] > vis[t[0]][t[1]]) continue;
            for(int[] d : dirct){
                int x = t[0] + d[0], y = t[1] + d[1];
                int time = t[2];
                if(x>=0&&x<n&&y>=0&&y<m&&vis[x][y]>Math.max(time, move[x][y])+1){
                    vis[x][y] = Math.max(time, move[x][y])+1;
                    que.offer(new int[]{x, y, vis[x][y]});
                }
            }
        }
        return vis[n-1][m-1];
    }
    
}

三,3342. 到达最后一个房间的最少时间 II

本题和T2一样,不过多了一个条件,每次移动花费的时间是1,2,1,2 反复的,这里有两种解决办法:

  1. 可以直接在存储数据时添加一个变量,专门用来记录移动到当前位置所需的移动时间
  2. 其实可以使用坐标来解决,从(x,y)到它相邻的房间,要么 x +1/-1,要么 y+1/-1,也就是说不管怎么移动,它的坐标 x+y 的奇偶性一定会发生变化,我们可以利用这点来计算移动时间

代码如下:

class Solution {
    int[][] dirct = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
    public int minTimeToReach(int[][] move) {
        PriorityQueue<int[]> que = new PriorityQueue<>((x, y)->x[2]-y[2]);
        que.add(new int[]{0, 0, 0});
        int n = move.length, m = move[0].length;
        int[][] vis = new int[n][m];
        for(int i=0; i<n; i++) Arrays.fill(vis[i], Integer.MAX_VALUE);
        vis[0][0] = 0;
        while(!que.isEmpty()){
            int[] t = que.poll();
            if(t[2] > vis[t[0]][t[1]]) continue;
            for(int[] d : dirct){
                int x = t[0] + d[0], y = t[1] + d[1];
                int add = (t[0] + t[1]) % 2 + 1;
                if(x>=0&&x<n&&y>=0&&y<m&&vis[x][y]>Math.max(t[2], move[x][y])+add){
                    vis[x][y] = Math.max(t[2], move[x][y])+add;
                    que.add(new int[]{x, y, vis[x][y]});
                }
            }
        }
        return vis[n-1][m-1];
    }
}

四,3343. 统计平衡排列的数目

本题是一道排列组合题,可以先将其进行分组,然后再排列,假设num的长度为n,题目要求奇偶位置的数字之和相等,也就是说可以通过该条件得到两个集合A,B,对于A集合它会有 m! 种排列(可能会有重复的),如果一个数字出现 k 次,需要将 m! / k!,本题只会出现0~9,所以会有 m! / k0!...k9!;同理,B集合会有 (n - m)! / k0!...k9! 种排列,它们一共会有 m! * (n-m)! / k0!...k9! (cnt[0]-k0)!...(cnt[9]-k9)! 种排列。

但是这只是其中一种分组,我们还需要计算一共能分成几种A,B集合,这里有点类似于两数之和,需要计算构成长度为 n / 2,总和为 total / 2 的集合有多少种可能,这里可以使用 dfs 计算,dfs(x,i,j):数字范围在[0,x]时,构成长度为 i,总和为 j 的集合的所有可能组合。

代码如下:

class Solution {
    private static final int MOD = 1_000_000_007;
    private static final int MX = 41;
    private static final long[] f = new long[MX];
    private static final long[] inv_f = new long[MX];
    // (a/b)%MOD = a * b ^ (MOD-2) % MOD 
    // 费马小定理!
    // 1 / b % MOD = b ^ (MOD-2) % MOD 注:MOD必须为质数
    // 1 / (a*b*c) % p = pow(a*b*c, p - 2) % p
    // 1 / (a*b) % p = pow(a*b, p-2) % p
    // 1 / (a*b) % p = 1 / (a*b*c) * c % p
    // 得到:inv_f[i-1] = inv_f[i] * i % p
    static{
        f[0] = 1;
        for(int i=1; i<MX; i++){
            f[i] = f[i-1] * i % MOD;
        }
        inv_f[MX-1] = pow(f[MX-1], MOD-2);
        for(int i=MX-1; i>0; i--){
            inv_f[i-1] = inv_f[i] * i % MOD;
        }
    }
    public int countBalancedPermutations(String num) {
        int n = num.length();
        int[] cnt = new int[10];
        int tar = 0;
        for(char c : num.toCharArray()){
            cnt[c-'0']++;
            tar += (int)(c-'0');
        }
        if(tar%2 == 1) return 0;
        for(int i=1; i<10; i++){
            cnt[i] += cnt[i-1];
        }
        int n1 = n / 2;
        memo = new int[10][n1 + 1][tar / 2 + 1];
        for (int[][] mat : memo) {
            for (int[] row : mat) {
                Arrays.fill(row, -1);
            }
        }
        return (int) (f[n1] * f[n - n1] % MOD * dfs(9, n1, tar / 2, cnt) % MOD);
    }
    int[][][] memo;
    int dfs(int x, int i, int j, int[] cnt){
        if(x < 0) return j==0?1:0;
        if(memo[x][i][j] != -1) return memo[x][i][j];
        long res = 0;
        int c = cnt[x] - (x > 0 ? cnt[x-1] : 0);
        int l = cnt[x] - i;
        for(int y=Math.max(c-l, 0); y<=Math.min(c, i) && y*x <= j; y++){
            int r = dfs(x-1, i-y, j-y*x, cnt);
            res = (res + r * inv_f[y] % MOD * inv_f[c-y])%MOD;
        }
        return memo[x][i][j] = (int)res;
    }
    private static long pow(long x, int n) {
        long res = 1;
        for (; n > 0; n /= 2) {
            if (n % 2 > 0) {
                res = res * x % MOD;
            }
            x = x * x % MOD;
        }
        return res;
    }
}

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

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

相关文章

聚观早报 | 比亚迪腾势D9登陆泰国;苹果 iOS 18.2 将发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 11月5日消息 比亚迪腾势D9登陆泰国 苹果 iOS 18.2 将发布 真我GT7 Pro防尘防水细节 小米15 Ultra最快明年登场 …

Pytest-Bdd-Playwright 系列教程(7):使用测试代码生成辅助工具

Pytest-Bdd-Playwright 系列教程&#xff08;7&#xff09;&#xff1a;测试代码生成辅助工具的使用 前言一、代码生成辅助工具的设计思路1.1 功能概览1.2 适用人群 二、如何使用 pytest-bdd 代码生成器三、代码生成器的实际应用场景3.1 初学者的学习和实践3.2 大规模功能测试3…

动态规划 —— dp 问题-买卖股票的最佳时机含冷冻期

1. 买卖股票的最佳时机含冷冻期 题目链接&#xff1a; 309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/ 2. 题目解析 3. 算法原理 状态表示&#xff1a;以…

大数据性能测试怎么做?看完这篇终于懂了

大数据性能测试的目的 1.大数据组件的性能回归&#xff0c;在版本升级的时候&#xff0c;进行新旧版本的性能比对。 2.在新版本/新的生产环境发布之后获取性能基线&#xff0c;建立可度量的参考标准&#xff0c;为其他测试场景或者调优过程提供对比参考。 3.在众多的发行版本…

鸿蒙开发:ArkTS如何读取图片资源

ArkTS在TS的基础上主要扩展了声明式UI能力&#xff0c;简化了构建和更新UI的过程。开发者可以以声明式的方式来描述UI的结构&#xff0c;如使用build方法中的代码块。同时&#xff0c;ArkTS提供了自定义组件、系统组件、属性方法、事件方法等&#xff0c;以构建应用UI界面。今天…

【Unity基础】Unity中如何导入字体?

在Unity中&#xff0c;不能像其他软件一样直接使用字体文件&#xff0c;需要通过FontAssetCreator将其转换成Texture的Asset文件&#xff0c;然后才能使用。 本文介绍了使用FontAssetCreator导入字体的过程&#xff0c;并对其参数设置进行了说明。 Font Asset Creator 是 Uni…

三、直流有刷电机H桥驱动原理

1、H桥简介 H桥驱动电路&#xff1a;是一种用于控制直流电机正反转及速度的电路&#xff0c;其名称来源于其电路结构类似于字母“H”。H桥驱动电路由四个开关元件&#xff08;如晶体管、MOSFET等&#xff09;组成&#xff0c;这些开关元件被配置成可以控制电机两端电流的方向&…

Unity性能优化 -- 性能分析工具

Stats窗口Profiler窗口Memory Profiler其他性能分析工具&#xff08;Physica Debugger 窗口&#xff0c;Import Activity 窗口&#xff0c;Code Coverage 窗口&#xff0c;Profile Analyzer 窗口&#xff0c;IMGUI Debugger 窗口&#xff09; Stats 统级数据窗口 game窗口 可…

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日)

html的week控件 获取周(星期)的第一天(周一)和最后一天(周日) <input type"week" id"week" class"my-css" value"ViewBag.DefaultWeek" /><script> function PageList() { var dateStrin…

[C++11] 可变参数模板

文章目录 基本语法及原理可变参数模板的基本语法参数包的两种类型可变参数模板的定义 sizeof... 运算符可变参数模板的实例化原理可变参数模板的意义 包扩展包扩展的基本概念包扩展的实现原理编译器如何展开参数包包扩展的高级应用 emplace 系列接口emplace_back 和 emplace 的…

Axure设计之左右滚动组件教程(动态面板)

很多项目产品设计经常会遇到左右滚动的导航、图片展示、内容区域等&#xff0c;接下来我们用Axure来实现一下左右滚动的菜单导航。通过案例我们可以举一反三进行其他方式的滚动组件设计&#xff0c;如常见的上下滚动、翻页滚动等等。 一、效果展示&#xff1a; 1、点击“向左箭…

qt QListWidget详解

1、概述 QListWidget 是 Qt 框架中的一个类&#xff0c;它提供了一个基于模型的视图&#xff0c;用于显示项目的列表。QListWidget 继承自 QAbstractItemView 并为项目列表提供了一个直观的接口。与 QTreeView 和 QTableView 不同&#xff0c;QListWidget 是专门为单行或多行项…

vue--vueCLI

何为CLI ■ CLI是Command-Line Interface,俗称脚手架. ■ 使用Vue.js开发大型应用时&#xff0c;我们需要考虑代码目录结构、项目结构和部署、热加载、代码单元测试等事情。&#xff08;vue 脚手架的作用&#xff09;&#xff0c; 而通过vue-cli即可&#xff1a;vue-cli 可以…

思维,CF 1735D - Meta-set

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1735D - Meta-set 二、解题报告 1、思路分析 考虑一个五元组<a, b, c…

C#的6种常用集合类

一.先来说说数组的不足&#xff08;也可以说集合与数组的区别&#xff09;&#xff1a; 1.数组是固定大小的&#xff0c;不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小&#xff0c;但是该方法是重新创建新设置大小的数组&#xff0c;用的是旧数组的元素初始…

深度学习-神经网络基础-激活函数与参数初始化(weight, bias)

一. 神经网络介绍 神经网络概念 神经元构建 神经网络 人工神经网络是一种模仿生物神经网络结构和功能的计算模型, 由神经元构成 将神经元串联起来 -> 神经网络 输入层: 数据 输出层: 目标(加权和) 隐藏层: 加权和 激活 全连接 第N层的每个神经元和第N-1层的所有神经元…

SpringBoot框架在资产管理中的应用

3系统分析 3.1可行性分析 通过对本企业资产管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本企业资产管理系统采用Spring Boot框架&#xff0c;JAVA作…

【C#】选课程序增加、删除统计学时

文章目录 【例6-2】编写选课程序。利用利用列表框和组合框增加和删除相关课程&#xff0c;并统计学时数1. 表6-2 属性设置2. 设计窗体及页面3. 代码实现4. 运行效果 【例6-2】编写选课程序。利用利用列表框和组合框增加和删除相关课程&#xff0c;并统计学时数 分析&#xff1…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…

ProtoBuf实战之网络版通讯录

目录 网络版通讯录需求 实现网络版通讯录 搭建服务端客户端 协议约定 客户端菜单功能 服务端代码 Protobuf 还常用于 通讯协议、服务端数据交换 的场景&#xff0c;接下来&#xff0c;我们将实现一个网络版本的通讯录&#xff0c;模拟实现客户端与服务端的交互&#xff0…