Leetcode - 周赛393

news2024/11/24 3:33:12

目录

一,3114. 替换字符可以得到的最晚时间

二,3115. 素数的最大距离

三,3116. 单面值组合的第 K 小金额

四, 3117. 划分数组得到最小的值之和


一,3114. 替换字符可以得到的最晚时间

本题是一道模拟题,直接上代码。

代码如下:

class Solution {
    public String findLatestTime(String s) {
        char[] t = s.toCharArray();
        if(t[0] == '?')
            t[0] = t[1]=='?'||t[1]<='1'?'1':'0';
        if(t[1] == '?')
            t[1] = t[0]=='1'?'1':'9';
        if(t[3] == '?')
            t[3] = '5';
        if(t[4] == '?')
            t[4] = '9';
        return new String(t);
    }
}

二,3115. 素数的最大距离

本题主要考察素数的定义,需要注意的是该题的范围包括1,所以需要额外判断一下。

代码如下: 

class Solution {
    public int maximumPrimeDifference(int[] nums) {
        int n = nums.length;
        int i = 0, j = n - 1;
        while(i < n){
            if(is_prime(nums[i])){//找第一个出现的素数
                break;
            }
            i++;
        }
        while(j >= 0){
            if(is_prime(nums[j])){//找最后一个出现的素数
                break;
            }
            j--;
        }
        return j-i;
    }
    boolean is_prime(int x){//校验是否是素数
        for(int i=2; i<=Math.sqrt(x); i++){
            if(x%i == 0)
                return false;
        }
        return x>=2;
    }
}

三,3116. 单面值组合的第 K 小金额

二分 + lcm + 容斥原理

根据题目和它给的数据范围,可以发现直接求第k小是非常困难的,所以直接想到二分答案,想使用二分,还要看题目是否有单调的性质,可以发现,当枚举的数越大,所能创造的金额就越多,就越容易满足条件,所以可以二分

接下来就是实现check方法,该方法需要统计在【0,二分答案】之间可以产生多少不重复的金额,再具体一点,就是计算在【0,二分答案】之间,coins数组中每个数及其倍数的并集,这里就要使用到容斥原理:

  • |A∪B| = |A| + |B| - |A∩B|
  • |A∪B∪C| = |A| + |B| - |A∩B| + |C| - |A∩C| - |B∩C| + |A∩B∩C|
  • ......

发现当求∩的集合的数量为单数时,它前面的符号是 +,为偶数时,它前面的符号是 -,也就是奇正偶负

搞清楚了符号问题,那么这里A∩..这个集合的大小该如何计算呢?举个例子,coins=[2,3]

求在【0,14】范围内 |2的倍数∩3的倍数| 的大小,2的倍数=[2,4,6,8,10,12,14],3的倍数=[3,6,9,12],它们的交集=[6,12],而这恰好是[2,3]最小公倍数的倍数,所以交集的大小就等于【二分答案(在这里指14) / 最小公倍数(在这里指6)】

而两个数的最小公倍数 = 两个数的乘积 / 两个数的最大公约数,如果最大公约数不会求,可以去网上学习一下辗转相除法,这里就不过多介绍了.

代码如下:

class Solution {
    public long findKthSmallest(int[] coins, int k) {
        Arrays.sort(coins);
        long l = k - 1;
        long r = (long)coins[0] * k;
        while(l <= r){//二分答案
            long mid = (l + r) / 2;
            if(check(mid, coins, k)){
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        return r + 1;
    }
    boolean check(long m, int[] coins, int k){
        int n = coins.length;
        long cnt = 0;
        for(int i=1; i<(1<<n); i++){//枚举子集
            long res_lcm = 1;
            for(int j=0; j<n; j++){
                if((i>>j&1) == 1){//如果i>>j&1为1,说明子集包括coins[j]
                    res_lcm = lcm(res_lcm, coins[j]);
                }
            }
            cnt += Integer.bitCount(i)%2==1?m/res_lcm:-m/res_lcm;
        }
        return cnt >= k;
    }

    long lcm(long a, long b){//最小公倍数
        return a*b/gcd(a,b);
    }
    long gcd(long a, long b){//最大公约数
        return b==0?a:gcd(b,a%b);
    }
}

 

四, 3117. 划分数组得到最小的值之和

划分dp

使用dfs来实现,dfs(i,j,and)的定义:前 i 个数分成 j 段所得到的最小子数组值之和,and是第 j 段的&值

dfs(i,j,and)有两个来源:

  • 当前nums[i]不划分,划分段数不变,即 j 不增加,用dfs表示就是 dfs(i+1,j,and)
  • 当前nums[i]划分到新的子数组中,划分段数 j 加一,用dfs表示就是 dfs(i+1,j+1,and) + nums[i],不过还需要注意的是,只有 and == andValue[j]时,才能划分
  • 根据上述可以推出 dfs(i,j,and) = Math.min(dfs(i+1,j,and),dfs(i+1,j+1,and) + nums[i])

dfs终止条件(n=nums.length,m=andValues.length):

  • 要保证剩下的数 n-i 可以分成 m-j 段,即 if ( n-i < m-j ),返回 Integer.MAX_VALUE/2
  • 当数组已经划分成了m段 j == m,如果 i == n,说明刚好划分完,返回 0;如果 i != n,说明还有数没划分,返回Integer.MAX_VALUE/2
  • 根据&的数量越多,&值越小这个性质,可以剪枝,if (and < andValue[j]),return Integer.MAX_VALUE/2.

这里使用Integer.MAX_VALUE/2是为了防止溢出

代码如下:

class Solution {
    //划分dp - 前i个数分成j段
    //&越多,&值越小
    Map<String,Integer> map = new HashMap<>();
    int n, m;
    int[] nums, andValues;
    public int minimumValueSum(int[] nums, int[] andValues) {
        n = nums.length;
        m = andValues.length;
        this.nums = nums;
        this.andValues = andValues;
        int ans = dfs(0,0,-1);
        return ans == Integer.MAX_VALUE/2 ? -1 : ans;
    }
    int dfs(int i, int j, int and){
        String key = i + "-" + j + "-" + and;
        if(!map.isEmpty() && map.containsKey(key)) 
            return map.get(key);//记忆化
        if(n-i < m-j) 
            return Integer.MAX_VALUE/2;//剩下的数不足以分成m-j段
        if(j == m) 
            return i==n?0:Integer.MAX_VALUE/2;
        and &= nums[i];
        if(and < andValues[j])//剪枝
            return Integer.MAX_VALUE/2;
        int res = dfs(i+1, j, and);
        if(and == andValues[j])
            res = Math.min(res, dfs(i+1, j+1, -1) + nums[i]);
        map.put(key, res);
        return res;
    }
}

 

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

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

相关文章

有效的括号 + 点击消除 || 匹配问题

目录 点击消除&#xff1a; 有效的括号&#xff1a; 点击消除&#xff1a; 点击消除_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/8d3643ec29654cf8908b5cf3a0479fd5?tpId308&tqId40462&ru/exam/oj 如题目所述&#xff0c; 示例1&#xf…

顺丰同城急送API对接(附源码)

一、背景 最近公司让我对接顺丰同城急送的API&#xff0c;讲讲里面需要注意的几点 官方的API文档有些示例代码也不全&#xff0c;具体细节不多说&#xff0c;如果你现在也需要对接他们API&#xff0c;可以参考本篇博客再配合官方文档结合起来看&#xff0c;可以让您再开发的时…

C++面向对象程序设计-北京大学-郭炜【课程笔记(七)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;七&#xff09;】 1、类型转换运算符2、自增、自减运算符的重载3、继承和派生的基本概念3.1、基本概念3.2、派生类对象的内存空间 4、继承关系和复合关系4.1、继承关系的使用4.2、复合关系的使用 5、派生类覆盖基类成员6…

【分治】Leetcode 数组中的第K个最大元素

题目讲解 数组中的第K个最大元素 算法讲解 堆排序&#xff1a;1. 寻找最后一个节点的父亲&#xff0c;依次向上遍历&#xff0c;完成小堆的建立&#xff1b;2. 从最后一个元素开始&#xff0c;和堆顶的数据做交换&#xff0c;此时最小的数据在对后面&#xff0c;然后对剩下的…

C++设计模式|创建型 4.建造者模式

1.什么是建造者模式? 建造者模式&#xff08;也被成为生成器模式&#xff09;&#xff0c;是一种创建型设计模式&#xff0c;软件开发过程中有的时候需要创建很复杂的对象&#xff0c;而建造者模式的主要思想是将对象的构建过程分为多个步骤&#xff0c;并为每个步骤定义一个…

OpenHarmony图形处理库—pyclipper [GN编译]

简介 pyclipper是图形处理库&#xff0c;用于剪裁和偏移直线和多边形。 下载安装 直接在OpenHarmony-SIG仓中搜索pyclipper并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的pyclipper库代码存在以下路径&#xff1a;./third_party/pyclipper 修改添加依…

Java 算法篇-深入了解 BF 与 KMP 算法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 BF 算法概述 1.1 BF 算法实际使用 2.0 KMP 算法概述 2.1 KMP 算法实际使用 2.2 相比于 BF 算法实现&#xff0c;KMP 算法的重要思想 2.3 为什么要这样设计&#x…

ATFX汇市:日元贬值导致进口物价走高,日央行或有二次加息计划

消息面&数据面&#xff1a; 日本央行行长植田和男表示&#xff0c;弱势日元可能影响通胀趋势&#xff0c;如果这样可能导致政策转变。意思是说&#xff0c;随着日元汇率逼近160.00&#xff0c;日元贬值对进口物价的影响越来越明显。如果日元继续保持贬值态势&#xff0c;日…

【Java】文件大小转换工具类(B,KB,MB,G,TB,PB)

说明 使用方法&#xff1a;FileMemoryUtil.prettyByteSize(35871)&#xff0c;参数为字节个数 返回结果&#xff1a;保留一位小数的自适应结果&#xff08;例如&#xff1a;4.1KB&#xff09;。可以留意在浏览器上下载的文件&#xff0c;会根据文件大小展示不同的单位&#xff…

腾讯面试准备-2024.3.25

腾讯面试准备-2024.3.25 腾讯面试准备-2024.3.25自我介绍C11/14/17新特性C11新特性C14新特性C17新特性 struct和class的区别进程状态现代的流媒体通信协议栈流媒体协议详解extern "C"程序从编译到执行的过程进程、线程、协程进程线程协程 如何实现一个信号与槽系统&a…

【强化学习的数学原理-赵世钰】课程笔记(十)Actor-Critic 方法

目录 一.最简单的 actor-critic&#xff08;QAC&#xff09;&#xff1a;The simplest actor-critic (QAC) 二.Advantage actor-critic (A2C) 三.Off-policy actor-critic 方法 四. Deterministic actor critic(DPG) Actor-Critic 方法把基于 value 的方法&#xff0c;特别…

maven3.9的settings.xml 内容学习

settings.xml 文件介绍 settings.xml 是 Maven 的配置文件&#xff0c;它允许你自定义 Maven 的行为&#xff0c;比如设置仓库、代理、认证信息等。在 Maven 3.9 中&#xff0c;settings.xml 的结构和内容可能与之前的版本相似&#xff0c;但可能会有一些小的改进或变化。下面…

【码农教程】手把手教你Mockito的使用

一、前期准备&#xff5e; 1、准备工作 <!--mockito依赖--> <dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>2.7.19</version><scope>test</scope> </dependenc…

NASM中的-f选项

2024年4月19日&#xff0c;周五下午 -f选项 在 NASM 中&#xff0c;-f 选项用于指定输出格式或目标文件格式。这个选项允许你告诉 NASM 将汇编代码编译成特定格式的目标文件&#xff0c;以便与特定的操作系统或环境兼容。下面是 -f 选项的一些常见用法和参数&#xff1a; -f …

excel表格怎么设置密码?excel文件加密的两个方法

一、加密码的原理​ Excel加密码的原理主要基于加密算法和密钥管理。当用户为Excel文件或工作表设置密码时&#xff0c;Excel会采用一种加密算法对文件或工作表进行加密处理。这种加密算法通常是对称加密算法&#xff0c;如AES(高级加密标准)或DES(数据加密标准)。 二&#x…

iframe和 blob实现JS,CSS,HTML直接当前页预览

先贴效果图&#xff1a; <template><div><div class"aaa"></div><div class"btn-run" click"tres">运行</div></div></template><script>import { mapState } from vuex;export default …

C++之类和对象三

目录 拷贝构造函数 定义铺垫 浅拷贝 深拷贝 总结 拷贝构造函数 那在创建对象时&#xff0c;可否创建一个与一个对象一某一样的新对象呢&#xff1f; 定义铺垫 构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c…

软考-系统集成项目管理中级--项目质量管理(输入输出很重要!!!本章占分较高,着重复习)

本章历年考题分值统计 本章重点常考知识点汇总清单 5、成本效益分析法:对每个质量活动进行成本效益分析&#xff0c;就是要比较其可能的成本与预期的效益。达到质量要求的主要效益包括减少返工、提高生产率、降低成本、提升干系人满意度及提升赢利能力。(掌握)17下64考题 本章…

IDEA配置Maven环境

黑马程序员JavaWeb开发教程 文章目录 如果当前有已经打开项目的话&#xff0c;File -> Close Project 到以下页面之后选择 Customize -> All settings… 配置maven的安装目录&#xff0c;maven的配置文件&#xff0c;maven的本地仓库&#xff08;修改完成之后一定要先…

DRF 序列化类保存save源码

【七】序列化保存save源码 【1】介绍 无论是创建还是修改数据&#xff0c;都需要执行save方法&#xff0c;再前面的使用中都没有再里面添加过参数 其实save中可以给额外参数比如.save(timedatetime.datetime.now())这个需要模型表中有time的字段&#xff0c;结果就是将当前时…