Leetcode - 130双周赛

news2025/1/19 3:03:22

目录

一,3142. 判断矩阵是否满足条件

二,3143. 正方形中的最多点数

三,3144. 分割字符频率相等的最少子字符串

四,3145. 大数组元素的乘积


一,3142. 判断矩阵是否满足条件

本题题意,满足每一列的数全部相等,列与列的数不相等,就返回true,否则返回false,直接模拟就行。

代码如下:

class Solution {
    public boolean satisfiesConditions(int[][] grid) {
        int n = grid.length, m = grid[0].length;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(i+1<n && grid[i][j] != grid[i+1][j]
                || j+1<m && grid[i][j] == grid[i][j+1]){
                    return false;
                }
            }
        }
        return true;
    }
}

二,3143. 正方形中的最多点数

方法一:二分边长

这道题具有单调性——正方形的边长越长,就越可能出现不合法的点,所以可以使用二分,但是有一个注意点,二分的是边长,而答案要的是正方形包含的点数,所以需要在check方法中不断更新答案。

class Solution {
    int ans;
    public int maxPointsInsideSquare(int[][] points, String s) {
        int n = s.length();
        int l = 0, r = (int)1e9;
        while(l <= r){
            int mid = (l + r) >>> 1;
            if(check(mid, points, s)){
                l = mid + 1;
            }else{
                r = mid - 1;
            }
        }
        return ans;
    }
    boolean check(int k, int[][] points, String s){
        Set<Character> set = new HashSet<>();
        for(int i=0; i<s.length(); i++){
            int t = Math.max(Math.abs(points[i][0]), Math.abs(points[i][1]));
            if(k >= t){
                if(set.contains(s.charAt(i))) 
                    return false;
                set.add(s.charAt(i));
            }
        }
        ans = set.size();
        return true;
    }
}

方法二:数学集合

可以先将点按照正方形的边长(正方形的边上)分组,再从小到大枚举正方形的边长,如果出现两个相同的标签,直接退出循环,否则将点数加入答案

class Solution {
    public int maxPointsInsideSquare(int[][] points, String s) {
        int n = s.length();
        TreeMap<Integer, Integer> map = new TreeMap<>();//<边长,标签(使用数字表示集合)>
        for(int i=0; i<n; i++){
            int[] x = points[i];
            int mx = Math.max(Math.abs(x[0]), Math.abs(x[1]));
            if(!map.containsKey(mx)){
                map.put(mx, 0);
            }
            int t = s.charAt(i) - 'a';//(1<<t)表示字符s.charAt(i)
            if((map.get(mx)&(1<<t)) != 0){//正方形边长上存在相同的标签,存入1<<26表示非法
                map.put(mx, map.get(mx)|(1<<26));
            }else{//否则,存入(1<<t)
                map.put(mx, map.get(mx)|(1<<t));
            }
        }
        int ans = 1<<26;//为了检测是否非法
        for(int x : map.values()){
            if((ans & x) != 0){//正方形内部存在相同的标签
                break;
            }
            ans |= x;
        }
        return Integer.bitCount(ans)-1;//-1表示减去1<<26
    }
}

三,3144. 分割字符频率相等的最少子字符串

划分dp:最少/最多能划分几段

一,dfs + 记忆化

dfs(i):表示 [0,i] 最少可以分成的段数

它只有一个转移来源:

  • 从 i 开始往前枚举 j,如果 [ j,i ] 是一个平衡字符串,那么 dfs(i) = Math.max(dfs(i),dfs(j)+1)

结束条件:i < 0 ,return 0

代码如下:

class Solution {
    int[] memo;
    public int minimumSubstringsInPartition(String s) {
        memo = new int[s.length()];
        Arrays.fill(memo, -1);
        return dfs(s.length()-1, s);
    }
    int dfs(int i, String s){
        if(i == -1) return 0;
        if(memo[i] != -1) return memo[i];
        int res = s.length();
        int[] cnt = new int[26];
        for(int j=i; j>=0; j--){
            cnt[s.charAt(j)-'a']++;
            if(check(cnt)){
                res = Math.min(res, dfs(j-1, s) + 1);
            }
        }
        return memo[i] = res;
    }
    boolean check(int[] cnt){//判断是否是平衡字符串
        int t = -1;
        for(int x : cnt){
            if(x != 0){
                if(t == -1){
                    t = x;
                }else if(x != t){
                    return false;
                }
            }
        }
        return true;
    }
}

二,递推

f [ i ]:表示前 i 个数最少可以分成的段数

从 i 开始往前枚举 j,如果 [ j,i ] 是一个平衡字符串,f[ i+1 ] = Math.max(f[i+1],f[j] + 1)

代码如下:

class Solution {
    //f[j]:前j个数最少能分成f[j]段
    public int minimumSubstringsInPartition(String s) {
        int n = s.length();
        int[] f = new int[n+1];
        Arrays.fill(f, Integer.MAX_VALUE);
        f[0] = 0;
        for(int i=0; i<n; i++){
            int[] cnt = new int[26];
            for(int j=i; j>=0; j--){
                cnt[s.charAt(j)-'a']++;
                if(check(cnt))
                    f[i+1] = Math.min(f[i+1], f[j]+1);
            }
        }
        return f[n];
    }
    boolean check(int[] cnt){
        int t = -1;
        for(int x : cnt){
            if(x != 0){
                if(t == -1){
                    t = x;
                }else if(x != t){
                    return false;
                }
            }
        }
        return true;
    }
}

四,3145. 大数组元素的乘积

膜拜大佬的题解,代码如下:

class Solution {
    public int[] findProductsOfElements(long[][] queries) {
        int[] ans = new int[queries.length];
        for (int i = 0; i < queries.length; i++) {
            long[] q = queries[i];
            long er = sumE(q[1] + 1);
            long el = sumE(q[0]);
            ans[i] = pow(2, er - el, q[2]);
        }
        return ans;
    }

    private long sumE(long k) {//计算幂次之和
        long res = 0, n = 0, cnt1 = 0, sumI = 0;
        for (long i = 63 - Long.numberOfLeadingZeros(k + 1); i > 0; i--) {
            long c = (cnt1 << i) + (i << (i - 1));//新增的幂次个数
            if (c <= k) {
                k -= c;
                res += (sumI << i) + ((i * (i - 1) / 2) << (i - 1));
                sumI += i; // 之前填的 1 的幂次之和
                cnt1++; // 之前填的 1 的个数
                n |= 1L << i; // 填 1
            }
        }
        // 最低位单独计算
        if (cnt1 <= k) {
            k -= cnt1;
            res += sumI;
            n++; // 填 1
        }
        // 剩余的 k 个幂次,由 n 的低 k 个 1 补充
        while (k-- > 0) {
            res += Long.numberOfTrailingZeros(n);
            n &= n - 1;
        }
        return res;
    }

    private int pow(long x, long n, long mod) {
        long res = 1 % mod;
        for (; n > 0; n /= 2) {
            if (n % 2 == 1) {
                res = (res * x) % mod;
            }
            x = (x * x) % mod;
        }
        return (int) res;
    }
}

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

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

相关文章

YOLOV8环境部署(GPU版本)

一、安装&#xff43;&#xff55;&#xff44;&#xff41;和&#xff43;&#xff55;&#xff44;&#xff4e;&#xff4e; 1、安装cuda之前先打开英伟达控制面板查看自己的显卡信息 2、“帮助”—>“系统信息”—>“组件”&#xff0c;然后看第三行的信息“Nvidia …

2024做安全测试必须要知道的几种方法!

前言 安全性测试(Security Testing)是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程&#xff0c;其主要目的是查找软件自身程序设计中存在的安全隐患&#xff0c;并检查应用程序对非法侵入的防范能力&#xff0c;安全指标不同&#xff0c;测试策略也不同。 但安全…

.net下使用cap实现消息异步处理

介绍 github地址 CAP 是一个基于 .NET Standard 的 C# 库&#xff0c;它是一种处理分布式事务的解决方案&#xff0c;同样具有 EventBus 的功能&#xff0c;它具有轻量级、易使用、高性能等特点。 新建项目 新建.net7web项目 安装依赖包 安装软件 安装redis和Sql Server …

【免费Web系列】大家好 ,今天是Web课程的第一天点赞收藏关注,持续更新作品 !

开干,开干!!! 1. 前端开发介绍 我们介绍Web网站工作流程的时候提到&#xff0c;前端开发&#xff0c;主要的职责就是将数据以好看的样式呈现出来。说白了&#xff0c;就是开发网页程序&#xff0c;如下图所示&#xff1a; 那在讲解web前端开发之前&#xff0c;我们先需要对we…

如何加密电脑文件夹?重要文件夹怎么加密?

文件夹可以帮助我们管理电脑数据&#xff0c;而文件夹并不具有安全保护功能&#xff0c;很容易导致数据泄露。因此&#xff0c;我们需要加密保护电脑文件夹。那么&#xff0c;如何加密电脑文件夹呢&#xff1f;下面我们就来了解一下。 EFS加密 EFS加密是Windows提供的数据加密…

【2024】最新微信小程序商城源码开源版 多用户无限多开+15大功能模块

随着微信小程序市场的蓬勃发展&#xff0c;越来越多的商家和企业意识到了微信小程序作为线上销售平台的重要性。为了满足广大用户的需求&#xff0c;分享一款2024年最新微信小程序商城源码开源版&#xff0c;该版本不仅支持多用户无限多开&#xff0c;还集成了15大功能模块&…

Vue的学习 —— <vue事件处理>

前言 事件指的就是用户和网页交互的行为&#xff0c;这些行为&#xff0c;包括&#xff1a;鼠标单击、鼠标双击、键盘按下、抬起等。为了简化开发&#xff0c;Vue为开发者提供了事件修饰符&#xff0c;它可以与v-on配合使用&#xff0c;以便于对事件进行控制和处理&#xff0c…

单体测试Junit

本来是想要查找关于junit 的知识&#xff0c;查找了依赖注入方式不同对junit测试也有影响。 正好备注下。 依赖注入三种方式&#xff1a; 字段注入&#xff08;Autowird&#xff09; 优点&#xff1a; 操作简单 代码简洁 缺点&#xff1a; 不支持…

Java面试八股之HashMap和HashTable有什么区别

Java中HashMap和HashTable有什么区别 线程安全性&#xff1a; HashMap&#xff1a;非线程安全。在多线程环境下&#xff0c;如果没有采取适当的同步措施&#xff0c;直接并发访问可能会导致数据不一致、死锁等问题。如果需要在多线程环境中安全地使用HashMap&#xff0c;通常…

【FFmpeg】Filter 过滤器 ② ( 裁剪过滤器 Crop Filter | 裁剪过滤器语法 | 裁剪过滤器内置变量 | 裁剪过滤器常用用法 )

文章目录 一、裁剪过滤器1、裁剪过滤器简介2、裁剪过滤器语法3、裁剪过滤器内置变量4、裁剪过滤器示例5、裁剪过滤器应用6、裁剪过滤器图示 二、裁剪过滤器常用用法1、裁剪指定像素的视频区域2、裁剪视频区域中心正方形 - 默认裁剪3、裁剪视频区域中心正方形 - 手动计算4、裁剪…

STM32程序下载电路设计

一、背景介绍 使用STM32F103RCT6作为单片机主控芯片&#xff0c;在进行电路板设计过程中&#xff0c;需要预留程序下载接口&#xff0c;可以选择使用JLINK下载器下载程序。 二、设计过程 1、查看STM32F103RCT6的芯片手册&#xff0c;找到下载程序的引脚端口PA13和PA14&#x…

使用WPF中的Trigger实现按钮样式动态更改

使用WPF中的Trigger实现按钮样式动态更改 在Windows Presentation Foundation (WPF)中&#xff0c;Trigger 是一种强大的机制&#xff0c;它可以基于控件的属性值来动态更改控件的样式。这篇博客将介绍如何使用Trigger实现按钮在鼠标悬停时样式动态更改的效果。我们将详细讨论为…

自然语言处理通用框架BERT原理解读

相关代码见文末 1.概述 问题背景: 传统Seq2Seq模型的局限性: 早期的机器翻译和文本生成任务常采用基于循环神经网络(RNN)的序列到序列(Seq2Seq)模型,这类模型在处理长序列时容易遇到梯度消失/爆炸问题,导致训练效率低,难以捕捉长期依赖。 RNN网络的问题: RNN及其变…

基于vs和C#的WPF应用之动画4---跳跳球

一、画布和图形 <Canvas x:Name"canvas4" Grid.Row"1" Grid.Column"1" Width"200" Height"200"><Canvas.Triggers><EventTrigger RoutedEvent"Loaded"><BeginStoryboard Storyboard"…

牛客热题:合并二叉树

牛客热题&#xff1a;二叉树与双向链表> &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题…

TypeScript基础知识:TypeScript是什么?为什么会出现TypeScript?TypeScript相较于javascript有那些优势?

TypeScript(简称:TS)是JavaScript的超集(JS有的TS 都有)。 图解就是&#xff1a; TypeScriptType javaScript(在JS 基础之上&#xff0c;为JS 添加了类型支持)。 TypeScript 是微软开发的开源编程语言&#xff0c;可以在任何运行JavaScript的地方运行。 那么为什么要出现type…

CPT7数据保存详细步骤

一、连接设备、打开NovAtelConnect 软件 (1)点击1,并在2中输入如下命令: LOG RANGEB ONTIME 1 // 输出原始数据记录在板卡LOG RAWEPHEMB ONTIME 1 // 输出 GPS 原始星历记录在板卡LOG bdsephemerisb ONTIME 1 // 输出

VMware17.5与Ubuntu22.04虚拟机环境搭建

VMware17.5安装教程也有参考此链接 简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设…

一文读懂deepSpeed:深度学习训练的并行化

引言 在深度学习领域&#xff0c;模型训练的过程不仅资源密集&#xff0c;而且技术复杂。近年来&#xff0c;随着模型规模和数据量的不断增长&#xff0c;深度学习训练面临着越来越多的挑战。这些挑战主要体现在计算资源的需求、训练效率、模型复杂度以及内存管理等多个方面。…

32位处理的寻址方式

32位处理器兼容16位处理器的寻址方式&#xff0c;可以运行传统的16位代码。但是由于32位的处理器都拥有32位的寄存器和算数逻辑部件&#xff0c;而且同内存芯片之间的数据通路至少是32位的&#xff0c;因此&#xff0c;所有需要从寄存器或者内存地址处取得操作数的指令都被扩充…