Leetcode - 130双周赛

目录

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

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

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

相关文章

LLama3大模型本地部署 仅需6步完成对话模型本地安装部署。附送可视化ui安装、自定义模型目录,修改模型保存地址,第三方微调模型、中文模型下载地址

本篇分为三部分 一&#xff1a;6步完成llama3大模型本地部署 二&#xff1a;8步完成llama3可视化对话界面安装 三&#xff1a;重设模型文件路径 四&#xff1a;微调模型、中文模型下载资源分享 一、LLama3 大模型本地部署安装 首先去mata官网下载ollama客户端 Ollama 选择合适…

Linux操作系统最著名的两大系列Red Hat和Debian

Linux操作系统可以根据其背后的项目或社区分为不同的系列&#xff0c;其中最著名的两大系列是Red Hat系列和Debian系列。 1.著名的两大系列是Red Hat和Debian Red Hat系列&#xff1a; Red Hat Enterprise Linux (RHEL)&#xff1a;这是Red Hat公司推出的企业级操作系统&#…

计算机网络-路由策略与路由控制一

到目前为止我们学习了路由与交换基础&#xff0c;路由协议有静态、RIP、OSPF、IS-IS等&#xff0c;但是根据实际组网需求&#xff0c;往往需要实施一些路由策略对路由信息进行过滤、属性设置等操作&#xff0c;通过对路由的控制&#xff0c;可以影响数据流量转发。 因此我们开始…

Vitis HLS 学习笔记--资源绑定-使用URAM(1)

目录 1. 简介 2. 代码分析 2.1 存储器代码 2.2 Implementation报告 2.3 存储器类型指定 2.4 存储器初始化 3. 总结 1. 简介 在博文《Vitis HLS 学习笔记--资源绑定-使用URAM-CSDN博客》中&#xff0c;介绍了如何在Vitis HLS环境下设计一个简易的存储器模型。 通过以下…

Skywalking配置traceId

1.引言 1.1 SkyWalking概述 SkyWalking是一个开源的分布式系统观测平台&#xff0c;旨在解决微服务和云原生架构中常见的性能监控和故障排除问题。自2015年由Apache基金会孵化以来&#xff0c;SkyWalking已经成为全球范围内广泛使用的APM&#xff08;应用性能管理&#xff09…

Selenium 自动化 —— 高级交互(click、sendKeys、submit、clear、select)

更多关于Selenium的知识请访问CSND论坛“兰亭序咖啡”的专栏&#xff1a;专栏《Selenium 从入门到精通》 ​​ 1. 前言 这是我的《Selenium从入门到精通》专栏的第11篇文章&#xff0c;前面花了很多时间在元素的定位上。不管是爬虫和自动化&#xff0c;找到元素后&#xff0c…

jvisualvm安装Visual GC插件

给jdk自带的jvisualvm安装Visual GC插件&#xff0c;遇到We’re sorry the java.net site has closed&#xff08;我们很抱歉java.net网站已经关闭&#xff09; 1、找到新的更新地址 visualvm新访问地址&#xff1a;https://visualvm.github.io/index.html 进入“Plugins”&am…

【介绍下Python多线程,什么是Python多线程】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

一个可自动生成行排号的excel VBA小工具

如下图&#xff0c;点击“生成行排号”按钮即可生成想要的行排号 基本用法如下&#xff1a; 1、设置顺序排列的行排号&#xff08;每排的行号一致&#xff0c;行的方向排序方向也一致&#xff09; 2、设置顺序排列的行排号&#xff08;行号从小到大排列&#xff0c;而不受排的…

UEC++学习(十五)创建、查找、加入会话

创建会话 基于上篇配置steam在线子系统之后&#xff0c;在Character.h中声明一个会话创建完成时的委托以及回调函数。 #include "Interfaces/OnlineSessionInterface.h"public://指向在线会话界面的指针,将会话接口存储在里面TSharedPtr<class IOnlineSession, ES…

电脑缺失api-ms-win-crt-runtime-l1-1-0.dll文件的几种修复方法

当您在使用电脑过程中遇到程序启动失败&#xff0c;提示缺少“api-ms-win-crt-runtime-l1-1-0.dll”文件时&#xff0c;不必过于焦虑&#xff0c;此问题通常与Windows系统的Visual C Redistributable组件未正确安装或损坏有关。小编将介绍5种修复电脑缺失api-ms-win-crt-runtim…

STM32-09-IWDG

文章目录 STM32 IWDG1. IWDG2. IWDG框图3. IWDG寄存器4. IWDG寄存器操作步骤5. IWDG溢出时间计算6. IWDG配置步骤7. 代码实现 STM32 IWDG 1. IWDG IWDG Independent watchdog&#xff0c;即独立看门狗&#xff0c;本质上是一个定时器&#xff0c;这个定时器有一个输出端&#…

elementui 那些遇到的问题呀

1、在父组件调用子组件方法的&#xff0c;现在想关闭el-dialog 弹框&#xff0c;清除编辑器里面的值&#xff0c;结果哦方法走了但是没清空&#xff0c;原代码是这样的 父组件&#xff1a;<el-dialog closed"formulaclosed" v-model"detailsFormVisible&quo…

颜色的表示和还原(一)

这篇文章主要提炼于ICCV 2019 Tutorial: Understanding Color and the In-Camera Image Processing Pipeline for Computer Vision。里面深入浅出地讲解了很多ISP中的基础知识&#xff0c;这里主要对颜色相关的部分做一点总结。 假设不成立了 相机经常被简单地看作是衡量光线…

2022 年高教社杯全国大学生数学建模竞赛-C 题 古代玻璃制品的成分分析与鉴别详解+聚类模型Python代码源码

前言 简单介绍一下我自己&#xff1a;博主专注建模四年&#xff0c;参与过大大小小数十来次数学建模&#xff0c;理解各类模型原理以及每种模型的建模流程和各类题目分析方法。参与过十余次数学建模大赛&#xff0c;三次美赛获得过二次M奖一次H奖&#xff0c;国赛二等奖。**提…

设计模式:外观模式(Facade)

设计模式&#xff1a;外观模式&#xff08;Facade&#xff09; 设计模式&#xff1a;外观模式&#xff08;Facade&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景模式扩展参考 设计模式&#xff1…

21【Aseprite 作图】画白菜

1 对着参考图画轮廓 2 缩小尺寸 变成这样 3 本来是红色的描边&#xff0c;可以通过油漆桶工具&#xff08;取消 “连续”&#xff09;&#xff0c;就把红色的轮廓线&#xff0c;变成黑色的 同时用吸管工具&#xff0c;吸取绿色和白色&#xff0c;用油漆桶填充颜色 4 加上阴影…

TypeScript高级类型 在鸿蒙中的使用 Partial、Required、Readonly、Pick、Record

我的工程代码在这里&#xff0c;持续更新中 欢迎交流&#xff0c;谢谢 https://github.com/MartinLi89/WanHarmony Partial <Type> 新定义 一个类型&#xff0c;将所有属性变为可选的类. class TextTS {a: string "1"b: string "2"c: string &…

05-应用级开发者 AI 时代破局点

后端应用级开发者该如何拥抱 AI GC&#xff1f;就是在这样的一个大的浪潮下&#xff0c;我们的传统的应用级开发者。我们该如何选择职业或者是如何去快速转型&#xff0c;跟上这样的一个行业的一个浪潮? 0 AI金字塔模型 越往上它的整个难度就是职业机会也好&#xff0c;或者说…

Mysql-几何类型-POINT

在MySQL中&#xff0c;地理空间数据类型和功能被称为GIS&#xff08;Geographic Information System&#xff0c;地理信息系统&#xff09;。MySQL支持几种不同的空间数据类型&#xff0c;包括点&#xff08;POINT&#xff09;、线&#xff08;LINESTRING&#xff09;、多边形&…