Leetcode - 143双周赛

news2024/12/23 14:55:30

目录

一,3345. 最小可整除数位乘积 I

二,3346. 执行操作后元素的最高频率 I

1.差分数组

2.同向三指针 + 滑动窗口

三, 3348. 最小可整除数位乘积 II


一,3345. 最小可整除数位乘积 I

本题直接暴力枚举,题目求 >=n 的数的数位乘积可以被 t 整除,示例一告诉我们 0 可以被任何数整除,对于任何数,至多加9,它必然会出现一个数位 0,所以它至多只需要枚举9次就可以得到答案。

代码如下:

class Solution {
    public int smallestNumber(int n, int t) {
        for(int i=n; ; i++){
            int a = i, s = 1;
            while(a > 0){
                s *= a%10;
                a /= 10;
            }
            if(s == 0 || s % t == 0) return i;
        }
    }
}

二,3346. 执行操作后元素的最高频率 I

本题与 T3 题目一样,这里介绍两种做法:

1.差分数组

对于 nums 数组中的每个元素 x,都能通过1次操作得到 [x-k,x+k] 中的任意数,而本题求最高频率,不就是将每个元素 x 所能得到的 [x-k,x+k] 都 +1,最后看哪个数的频率最大(本题还需注意操作次数的限制),将 [x-k,x+k] 一个范围的数同时加/减,这就是差分数组。

代码如下:

class Solution {
    public int maxFrequency(int[] nums, int k, int numOperations) {
        TreeMap<Integer, Integer> map = new TreeMap<>();
        Map<Integer, Integer> cnt = new HashMap<>();
        for(int x : nums){
            cnt.merge(x, 1, Integer::sum);
            map.merge(x-k, 1, Integer::sum);
            //因为出现频率最高的数也可能是它本身
            //所以这里需要将x添加到cnt中,否则下面不会遍历到
            map.merge(x, 0, Integer::sum);
            map.merge(x+k+1, -1, Integer::sum);
        }
        int pre = 0, ans = 0;
        for(int x : map.keySet()){
            pre += map.get(x);
            ans = Math.max(ans, Math.min(pre, numOperations + cnt.getOrDefault(x, 0)));
        }
        return ans;
    }
}

2.同向三指针 + 滑动窗口

假如出现频率最高的数就是数组 nums 中的一个元素 x,如何计算它的出现频率?也就是计算nums 数组中有几个元素在 [x-k,x+k] 中,可以使用二分求满足条件的左端点L和右端点R,得到答案 R - L + 1,而使用二分的前提是有序,所以需要先排序。

但是要对每个元素都二分还是有点慢,注意这里已经排过序了,所以对于每个元素 x,它对应的范围 [x-k,x+k](对应合法下标 [L,R]) 也是在同步增加的,所以可以使用同向三指针来计算。

但是上述做法还没有计算出现频率最高的数不在 nums 中的情况,可以枚举x = nums[r]作为被修改的最大元素。计算元素值在 [x-2*k,x] 中的元素个数。这样就变成了一个滑窗问题。

代码如下:

class Solution {
    public int maxFrequency(int[] nums, int k, int op) {
        Arrays.sort(nums);
        int n = nums.length;
        int ans = 0, l = 0, r = 0, cnt = 0;
        //最高频率的元素在nums数组中的情况
        for(int i = 0; i < n; i++){
            cnt++;
            int x = nums[i];
            if(i < n - 1 && x == nums[i+1]) 
                continue;
            while(l < n && nums[l] < x - k){
                l++;
            }
            while(r < n && nums[r] <= x + k){
                r++;
            }
            ans = Math.max(ans, Math.min(r - l, op + cnt));
            cnt = 0;
        }
        if(ans >= op) return ans;
        //[x-2*k, x]
        //最高频率的元素不在nums数组中的情况
        for(l = 0, r = 0; r < n; r++){
            while(nums[l] < nums[r] - 2 * k){
                l++;
            }
            ans = Math.max(ans, Math.min(op, r - l + 1));
        }
        return ans;
    }
}

三, 3348. 最小可整除数位乘积 II

本题直接暴力枚举每一个位数,有点类似于数位DP。先判断各数位之积能否被 t 整除,由于每个数位都是0~9,所以只需要判断 t 能否被 2,3,5,7 整除就行,如果不能被整除,说明 t 一定有一个 > 7 的质数(必然 > 9)所以不可能存在,直接返回 -1。

在dfs暴力枚举中如何判断数的位数之积能被 t 整除,可以直接使用 t / gcd(x,t),最后判断 t == 1就行。

代码如下:

class Solution {
    int[] ans;
    int cnt = 0;
    public String smallestNumber(String s, long t) {
        long tmp = t;
        for(int x : new int[]{2, 3, 5, 7}){
            while(tmp % x == 0){
                tmp /= x;
                cnt++;
            }
        }
        if(tmp > 1) return "-1";
        cnt = Math.max(cnt - s.length() + 1, 1);
        s = "0".repeat(cnt) + s;

        int n = s.length();
        vis = new HashSet[n];
        Arrays.setAll(vis, e->new HashSet<>());

        ans = new int[n];
        dfs(0, t, true, s.toCharArray());
        StringBuilder res = new StringBuilder();
        for(int x : ans) {
            if(x > 0) res.append(x);
        }
        return res.toString();
    }
    Set<Long>[] vis;
    boolean dfs(int i, long t, boolean islimit, char[] s){
        if(i == s.length) return t==1;
        if(!islimit && !vis[i].add(t)) return false;
        if(islimit && i < cnt && dfs(i+1, t, true, s)) //前导0
            return true;
        int low = islimit ? s[i] - '0' : 0;
        for(int d=Math.max(low, 1); d<10; d++){
            ans[i] = d;
            if(dfs(i+1, t/gcd(t,d), islimit&&d==low, s))
                return true;
        }
        return false;
    }
    long gcd(long x, long y){
        return y==0?x:gcd(y, x%y);
    }
}

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

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

相关文章

Springboot3 配置Swargger3.0版本

一、swagger 版本配置&#xff0c;我用的3.0.0 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency>二、说明&#xff1a;springdo…

error MSB3325:无法导入以下密钥文件xxx,该密钥文件可能受密码保护

错误提示信息(类似如下)&#xff1a; error MSB3325: 无法导入以下密钥文件: F:\...\Common.pfx。该密钥文件可能受密码保护。若要更正此问题&#xff0c;请尝试再次导入证书&#xff0c;或手动将证书安装到具有以下密钥容器名称的强名称 CSP: VS_KEY_A65F207BE95F57D0 出现此…

喜报|超维机器人荣获昇腾AI创新大赛铜奖

近日&#xff0c;在备受瞩目的昇腾AI创新大赛中&#xff0c;超维机器人凭借扎实的技术实力和创新产品&#xff0c;荣获大赛铜奖。这一荣誉不仅展现了超维机器人在智能巡检领域的技术创新与突破&#xff0c;也标志着超维机器人的智能巡检解决方案在人工智能领域获得了广泛认可&a…

[[nodiscard]] 使用说明

1 作用 [[nodiscard]] 属性&#xff1a;这个属性可以用于函数或者返回类型。它的作用是告诉编译器&#xff1a;调用这个函数时&#xff0c;它的返回值不应被忽略。如果程序员调用了这样的函数但没有使用它的返回值&#xff0c;编译器会发出警告。这对于那些返回重要状态或错误…

golang分布式缓存项目 Day4 一致性哈希

注&#xff1a;该项目原作者&#xff1a;https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习 为什么使用一致性哈希 我该访问谁 对于分布式缓存来说&#xff0c;当一个节点接收到请求&#xff0c;如…

MySQL数据库专栏(四)MySQL数据库链接操作C#篇

摘要 本篇文章主要介绍C#链接MySQL数据库的接口介绍&#xff0c;使用实例及注意事项&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、添加引用 2、接口介绍 2.1、MySqlConnection 2.2、MySqlCommand 2.3、MySqlDataReader…

借助 Pause 容器调试 Pod

借助 Pause 容器调试 Pod 在 K8S 中&#xff0c;Pod 是最核心、最基础的资源对象&#xff0c;也是 Kubernetes 中调度最小单元。在介绍 Pause 容器之前需要先说明下 Pod 与容器的关系来理解为什么需要 Pause 容器来帮助调试 1. Pod 与 容器的关系 Pod 是一个抽象的逻辑概念&…

UE5 umg学习(四) 将UI控件切换到关卡中

视频资料 7、将UI控件渲染到关卡_哔哩哔哩_bilibili 在前三节里&#xff0c;创建了用户的控件蓝图Widget_BP 目标是运行的时候&#xff0c;开始运行这个蓝图&#xff0c;因此需要在开始事件触发运行 首先&#xff0c;回到主页&#xff0c;点击关卡蓝图 要从事件开始运行时 …

React Hooks在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 引言 React Hooks …

军工行业运维:监控易引领自主可控新潮流

在军工行业&#xff0c;信息安全和技术创新始终是发展的重中之重。随着信息化建设的不断深入&#xff0c;对监控产品的要求也日益严格。 监控易作为一款高性能、全面性的运维监控解决方案&#xff0c;凭借其国产化、自主可控的特性&#xff0c;以及对军工行业特殊需求的深刻理解…

【操作系统】——调度算法

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 先来先服务&#xff08;FCFS, First Come First Serve) 短作业优先&#xff08;SJF, Shortest Job Fi…

C++入门基础知识147—【关于C++ 一元运算符重载】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 一元运算符重载的相关内容&#xff0…

【测试框架篇】单元测试框架pytest(1):环境安装和配置

一、pytest简介 Pytest是Python的一种单元测试框架&#xff0c;与Python自带的unittest测试框架类似&#xff0c;但是比 unittest框架使用起来更简洁&#xff0c;效率更高。 二、pytest特点 Pytest是一个非常成熟的Python测试框架,主要特点有以下几点&#xff1a; 非常容易…

【CANOE】【学习】【DecodeString】字节转为中文字符输出

系列文章目录 文章目录 系列文章目录前言一、DecodeString 转为中文字节输出二、代码举例1.代码Demo2.DecodeString 函数说明函数语法&#xff1a;参数说明&#xff1a;返回值&#xff1a;使用示例&#xff1a;示例代码&#xff1a; 说明&#xff1a; 前言 有时候使用的时候&a…

边缘计算在智能交通系统中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 边缘计算在智能交通系统中的应用 边缘计算在智能交通系统中的应用 边缘计算在智能交通系统中的应用 引言 边缘计算概述 定义与原…

CC1链学习记录

&#x1f338; 前言 上篇文章学习记录了URLDNS链&#xff0c;接下来学习一下Common-Colections利用链。 &#x1f338; 相关介绍 Common-Colections是Apache软件基金会的项目&#xff0c;对Java标准的Collections API提供了很好的补充&#xff0c;在其基础上对常用的数据结构…

边缘计算在智能物流中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 边缘计算在智能物流中的应用 边缘计算在智能物流中的应用 边缘计算在智能物流中的应用 引言 边缘计算概述 定义与原理 发展历程 …

《多模稳控应急通讯设备技术规范》出炉,应急通讯有章可循!

近日&#xff0c;由深圳市遨游通讯设备有限公司参与的《多模稳控应急通讯设备技术规范》在经历多项严格的审核程序后&#xff0c;由中国中小商会企业协会正式发布实施。该标准详细规定了多模稳控应急通讯设备的术语和定义、产品型号、技术要求、试验方法、检验规则、标志、包装…

生成任意3D和4D场景!GenXD:通用3D-4D联合生成框架 | 新加坡国立微软

文章链接: https://arxiv.org/pdf/2411.02319 项目链接&#xff1a;https://gen-x-d.github.io/ 有视频 亮点直击 设计了一个数据整理流程&#xff0c;从视频中获取包含可移动物体的高质量4D数据&#xff0c;并为30,000个视频标注了相机姿态。这个大规模数据集称为CamVid-30K&…

全面解读:低代码开发平台的必备要素——系统策划篇

在传统开发过程中&#xff0c;系统策划起着举足轻重的作用&#xff0c;它宛如一位幕后的总指挥&#xff0c;把控着整个软件开发项目的走向。而随着技术的不断进步&#xff0c;低代码开发平台逐渐崭露头角&#xff0c;它以快速开发、降低技术门槛等优势吸引了众多企业和开发者的…