Leetcode - 143双周赛

目录

一,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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VS2022项目配置笔记

文章目录 $(ProjectDir&#xff09;与 $(SolutionDir) 宏附加包含目录VC目录和C/C的区别 $(ProjectDir&#xff09;与 $(SolutionDir) 宏 假设有一个解决方案 MySolution&#xff0c;其中包含两个项目 ProjectA 和 ProjectB&#xff0c;目录结构如下&#xff1a; C:\Projects\…

ReactPress:深入解析技术方案设计与源码

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;欢迎一起共建&#xff0c;感谢Star。 ReactPress是一个基于React框架开发的开源发布平台&#xff0c;它不仅仅是一个简单的博客系统&#xff0c;更是一个功能全…

[编译报错]ImportError: No module named _sqlite3解决办法

1. 问题描述&#xff1a; 在使用python进行代码编译时&#xff0c;提示下面报错&#xff1a; "/home/bspuser/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py", line 18, in <module>import sqlite3File "/usr/local/lib/python2.7/sqlite3/_…

信号量和线程池

1.信号量 POSIX信号量&#xff0c;用与同步操作&#xff0c;达到无冲突的访问共享资源目的&#xff0c;POSIX信号量可以用于线程间同步 初始化信号量 #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); sem&#xff1a;指向sem_t类…

泷羽sec学习打卡-Linux基础2

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于Linux的那些事儿-Base2 一、Linux-Base2linux有哪些目录呢&#xff1f;不同目录下有哪些具体的文件呢…

【Android、IOS、Flutter、鸿蒙、ReactNative 】约束布局

Android XML 约束布局 参考 TextView居中 TextView 垂直居中并且靠右 TextView 宽高设置百分比 宽和高的比例 app:layout_constraintDimensionRatio"h,2:1" 表示子视图的宽高比为2:1&#xff0c;其中 h表示保持宽度不变&#xff0c;高度自动调整。 最大宽度 设…

使用HTML、CSS和JavaScript创建动态圣诞树

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

golang分布式缓存项目 Day1 LRU 缓存淘汰策略

注&#xff1a;该项目原作者&#xff1a;https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 LRU缓存淘汰策略 三种缓存淘汰策略 FIFO&#xff08;First In, First Out&#xff09;先进先出 原理&…

面向对象的需求分析和设计(一)

[toc] 1. 引言 前一篇文章《我对需求分析的理解》提到了面向对象分析和设计&#xff0c;正好最近又重新有重点的读了谭云杰著的《Think in UML》&#xff0c;感觉有必要写把书中一些核心内容观点以及自己的想法整理出来&#xff0c;一是方便自己日后的复习&#xff0c;另外也…

php中ajax怎么使用【小白专用24.11.12】

在PHP中&#xff0c;使用Ajax可以实现页面异步加载和动态数据交互。下面是使用Ajax的基本方法&#xff1a; <?php // ajax_endpoint.php// 处理请求&#xff0c;并返回JSON格式的响应 $responseData array(message > Hello from PHP!); header(Content-Type: applicati…

【css】html里面的图片宽度设为百分比,高度要与宽度一样

场景&#xff1a;展示图片列表的时候&#xff0c;原始图片宽高不一致。 外层div的宽度自适应&#xff0c;图片宽度不能固定数值&#xff0c;只能设置百分比。图片高度也不能设置固定数值。 如何让图片的高度与图片的宽度一样呢&#xff1f; html代码 &#xff1a; <div cl…

开源项目推荐——OpenDroneMap无人机影像数据处理

实景三维作为GIS最火的课题&#xff0c;最近在想做一套自己的三维构建工具&#xff0c;考察了几个开源项目&#xff0c;把自己的搜索过程用csdn记录下来&#xff0c;希望也能帮助到各位同仁。 OpenDroneMap&#xff08;ODM&#xff09;是一个开源项目&#xff0c;旨在处理无人…

快速提升ROI,收藏这份Facebook广告投放技巧!

Facebook广告在海外数字营销中占据重要地位。据统计&#xff0c;约有 700 万广告商活跃在该平台上&#xff0c;购买力不容小觑。 然而&#xff0c;当前 Facebook 广告竞争激烈&#xff0c;导致广告位供不应求&#xff0c;成本上升&#xff0c;尤其是在下半年营销旺季中&#xf…

C++提高编程-泛型编程

一、模板&#xff1a; 1.1.模板的概念: 1.模板就是建立通用的模具&#xff0c;大大提高复用性2.例如生活中的模板: 一寸照片模板&#xff1a; PPT模板&#xff1a; 模板的特点&#xff1a; 模板不可以直接使用&#xff0c;它只是一个框架模板的通用并不是万能的 二、泛型编…

漫谈分布式唯一ID

文章目录 本系列前言UUIDDB自增主键Redis incr命令号段模式雪花算法 本系列 漫谈分布式唯一ID&#xff08;本文&#xff09;分布式唯一ID生成&#xff08;二&#xff09;&#xff1a;leaf分布式唯一ID生成&#xff08;三&#xff09;&#xff1a;uid-generator分布式唯一ID生成…

大语言模型LLMs在医学领域的最新进展总结

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 相比其他学科&#xff0c;医学AI&#xff0c;是发表学术成果最多的领域。 医学数据的多样性和复杂性&#xff08;包括文本、图像、基因组数据等&#xff09;&#xff0c;使得…

Vue 学习随笔系列十四 -- JavaScript巧妙用法

JavaScript巧妙用法 文章目录 JavaScript巧妙用法1、String.padStart 函数2、String.padEnd 函数3、tirm 函数3. Object.freeze 函数4. Object.fromEntries 函数5. Object.entries 函数6. Array.prototype.flat 函数 1、String.padStart 函数 在字符串前面进行填充 let temp …

【PGCCC】Postgresql 物理流复制

postgresql 提供了主从复制功能&#xff0c;有基于文件的拷贝和基于 tcp 流的数据传输两种方式。两种方式都是传输 wal 数据&#xff0c;前者是等待生成一个完整的wal文件后&#xff0c;才会触发传输&#xff0c;后者是实时传输的。可以看出来基于文件方式的延迟会比较高&#…

每日小练:Day2

1.乒乓球筐 题目链接&#xff1a;乒乓球筐__牛客网 题目描述&#xff1a; 这道题主要考察B盒是不是A盒的子集&#xff0c;我们可以通过哈希表来做 单哈希表 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public stat…

esp32学习:如何解决OV5640摄像头发热问题

我们在使用esp开发板过程中&#xff0c;连接ov2640摄像头时&#xff0c;非常正常&#xff0c;但连接ov5640摄像头时&#xff0c;会发现摄像头发烫&#xff0c;非常热&#xff0c;我们网上找解决方案&#xff0c;基本都是加散热片&#xff0c;没有根本解决问题。 前段时间&#…