Leetcode - 周赛413

news2025/1/11 2:54:16

目录

一,3274. 检查棋盘方格颜色是否相同

二,3275. 第 K 近障碍物查询

三,3276. 选择矩阵中单元格的最大得分

四,3277. 查询子数组最大异或值


一,3274. 检查棋盘方格颜色是否相同

本题就是找规律,假设白色是true,黑色是false,可以发现 a - 2 4 6 8,b - 1 3 5 7 是白色,也就是说可以通过 (x - 'a')% 2 == (y - '0')%2 来判断该点是什么颜色,再返回两个点颜色是否相同。

代码如下:

class Solution {
    //a - 2 4 6 8
    //b - 1 3 5 7
    //c - 2 4 6 8
    //白
    public boolean checkTwoChessboards(String c1, String c2) {
        boolean a = (c1.charAt(0)-'a')%2 == (c1.charAt(1)-'0')%2;
        boolean b = (c2.charAt(0)-'a')%2 == (c2.charAt(1)-'0')%2;
        return a == b;
    }
}

二,3275. 第 K 近障碍物查询

本题是一种常见的堆应用问题(Top k 问题),维护第 k 小使用最大堆,维护第 k 大使用最小堆。本题求第 k 小的距离,所以使用最大堆。通过维护堆的大小来达到目的。

代码如下:

class Solution {
    public int[] resultsArray(int[][] queries, int k) {
        int n = queries.length;
        int[] ans = new int[n];
        PriorityQueue<Integer> que = new PriorityQueue<>((x,y)->y-x);
        for(int i=0; i<n; i++){
            que.offer(Math.abs(queries[i][0]) + Math.abs(queries[i][1]));
            if(que.size() > k)
                que.poll();
            ans[i] = que.size() == k ? que.peek() : -1;
        }
        return ans;
    }
}

三,3276. 选择矩阵中单元格的最大得分

本题可以使用枚举选哪个来做,枚举每一行可以选取的数字,求出所有组合中的最大得分,可以这样定义 dfs(i,j):前 i 行可以获得的最大得分,j表示已经选举过的数字。代码如下:

//超时写法
//Java无法支持长度为100的整形,所以这里用py写的
class Solution:
    def maxScore(self, grid: List[List[int]]) -> int:
        @cache
        def dfs(i: int, x: int) -> int:
            if i < 0: return 0
            res = dfs(i-1, x)
            for j in range(len(grid[0])):
                y = grid[i][j]
                if x >> y & 1: continue
                res = max(res, dfs(i-1, x|1<<y) + y)
            return res
        dfs.cache_clear()
        ans = dfs(len(grid)-1, 0)
        return ans 

但是该算法的时间复杂是O(n^2*2^100),这个做法明显超时了,那么我们要如何来降低时间复杂度?

之前有场周赛可以提供一点思路,就是如果枚举下标超时,那么我们是否可以尝试枚举值呢?对于本题来说,矩阵的数据范围是1~100,此时它的时间复杂度就变成了O(mn * 2 ^ n),我们可以使用选或不选的思路,定义dfs(i,j):在 [1,i] 区间选择数字,且该数字不会出现在 j 集合中,此时所选元素的最大值之和。

  • 对于 i,如果不选,那么接下来就变成从 [1,i-1] 区间选择数字,且该数字不会出现在 j 集合中,此时所选元素的最大值之和,状态表示为 dfs(i-1,j)
  • 对于 i,如果选,假设该值在 k 行(在dfs之前要预处理每个值所在的行),那么接下来就变成从 [1,i-1] 区间选择数字,且该数字不会出现在 j U k 集合中,此时所选元素的最大值之和,状态表示为 dfs(i-1,j|1<<k)

代码如下:

class Solution {
    public int maxScore(List<List<Integer>> grid) {
        List<Integer>[] pos = new ArrayList[101];
        Arrays.setAll(pos, e -> new ArrayList<>());
        for(int i=0; i<grid.size(); i++){
            Set<Integer> set = new HashSet<>();
            for(int x : grid.get(i))
                set.add(x);
            for(int x : set)
                pos[x].add(i);
        }
        memo = new int[101][1<<grid.size()];
        for(int i=0; i<101; i++)
            Arrays.fill(memo[i], -1);
        return dfs(100, 0, pos);
    }
    int[][] memo;
    int dfs(int i, int j, List<Integer>[] pos){
        if(i == 0) return 0;
        if(memo[i][j] != -1) return memo[i][j];
        int res = dfs(i-1, j, pos);
        for(int x : pos[i]){
            if((j>>x&1) == 1) continue;
            res = Math.max(res, dfs(i-1, j|1<<x, pos) + i);
        }
        return memo[i][j] = res;
    }
}

递推版本:

class Solution {
    public int maxScore(List<List<Integer>> grid) {
        List<Integer>[] pos = new ArrayList[101];
        Arrays.setAll(pos, e -> new ArrayList<>());
        for(int i=0; i<grid.size(); i++){
            Set<Integer> set = new HashSet<>();
            for(int x : grid.get(i))
                set.add(x);
            for(int x : set)
                pos[x].add(i);
        }
        int[][] f = new int[101][1<<grid.size()];
        for(int i=1; i<101; i++){
            for(int j=0; j<1<<grid.size(); j++){
                f[i][j] = f[i-1][j];
                for(int x : pos[i]){
                    if((j>>x&1) == 1) continue;
                    f[i][j] = Math.max(f[i][j], f[i-1][j|1<<x] + i);
                }
            }
        }
        return f[100][0];
    }
}

四,3277. 查询子数组最大异或值

本题可以通过模拟每一步的过程来得到一个递推公式,如图所示:

根据该公式我们可以得到任意一个区间的异或值,那么要如何计算 [L,R] 区间子数组的最大异或值呢?这里也可以使用区间dp,mx[i][j]:[i,j] 区间的子数组的最大异或值,mx[i][j] = max(f[i][j],mx[i][j-1],mx[i+1][j]),画个图理解一下:

代码如下:

class Solution {
    public int[] maximumSubarrayXor(int[] nums, int[][] queries) {
        int n = nums.length;
        int[][] f = new int[n][n];
        //f[i][j] = f[i+1][j]^f[i][j-1];
        int[][] mx = new int[n][n];
        //mx[i][j] = max(f[i][j], max(mx[i+1][j], mx[i][j-1]))
        for(int i=n-1; i>=0; i--){
            f[i][i] = mx[i][i] = nums[i];
            for(int j=i+1; j<n; j++){
                f[i][j] = f[i+1][j]^f[i][j-1];
                mx[i][j] = Math.max(f[i][j], Math.max(mx[i+1][j], mx[i][j-1]));
            }
        }
        int[] ans = new int[queries.length];
        for(int i=0; i<queries.length; i++){
            ans[i] = mx[queries[i][0]][queries[i][1]];
        }
        return ans;
    }
}

 

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

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

相关文章

x11转发远程图形界面

1、 开一个有vnc的节点 2、 开放所有用户的Xserver权限 xhost 3、X11转发 ssh hlzhang192.168.3.156 -X4、打开远程窗口 paraview在227的界面打开156的图形窗口

uniapp和vue3中使用vConsole在H5中开启移动端调试

uniapp和vue3中使用vConsole在H5中开启移动端调试 1. 安装vconsole npm install vconsole --save2. 在main.js中全局引入 重新启动项目即可

【C++】手搓实现模板类

myTamplate.h #ifndef MYTAMPLATE_H #define MYTAMPLATE_H #include <iostream> using namespace std;template<typename T> class Node {T *data; //数据域int size; //指针域int len;//实际长度 public://无参构造Node():size(10),len(0){data new T[size]…

写的一致性问题之双写模式

文章目录 1、先写mysql&#xff1a;mysql会回滚&#xff0c;而redis不会回滚2、先写redis&#xff1a; 1、先写mysql&#xff1a;mysql会回滚&#xff0c;而redis不会回滚 写入msql成功&#xff0c;写入redis也成功&#xff0c;但是后续事务提交失败&#xff0c;mysql会回滚&a…

Django学习(一)

一、创建django项目 二、修改settings.py里的配置&#xff1a; 1、修改语言和时区&#xff1a; # 语言编码 LANGUAGE_CODE zh-hansTIME_ZONE UTCUSE_I18N True# 不用时区 USE_TZ False 2、配置数据库&#xff1a; DATABASES {default: {ENGINE: django.db.backends.m…

Python中的self有什么作用

你是否曾经好奇过,为什么Python类中的方法总是有一个神秘的self参数?为什么有时它似乎可有可无,有时却又不可或缺?今天,让我们一起深入探讨Python中self的奥秘,揭开面向对象编程的神秘面纱! 目录 引言:self的重要性self的本质:实例的引用为什么需要self?self的工作原理self的…

极米科技:走出舒适圈,推动数据架构现代化升级 | OceanBase 《DB大咖说》

《DB 大咖说》第 13 期&#xff0c;邀请到了极米科技软件与创新产品线高级架构师施刘凡来进行分享。 在小红书平台上&#xff0c;“是否应将家里的电视升级为投影仪&#xff1f;”这一话题激发了上百万篇笔记的分享与推荐&#xff0c;反映出年轻群体对投影仪的偏好。随着手机、…

Java MVC

1. MVC模式 1.1. JavaBean JavaBean&#xff1a;符合特定规范的Java类&#xff0c;是一种可重用的组件 特定规范&#xff1a; public, class, 提供无参数构造方法属性private提供public的getter和setter方法 功能分类&#xff1a; 封装数据&#xff1a;数据Bean&#xff0c…

【gtokentool】什么是数字货币?怎么使用?

一、什么是数字货币 数字货币是一种基于密码学原理&#xff0c;独立于传统银行体系运行的电子货币形式。数字货币具有以下特点&#xff1a; 去中心化&#xff1a;数字货币采用去中心化的交易验证方式&#xff0c;不依赖于任何中央机构或政府。安全性高&#xff1a;通过加密算法…

STM32G474之DAC

STM32G474分别使用CORDIC硬件和“math.h”的正弦值&#xff0c;从DAC1和DAC2输出。 1、DAC特点 PA4的附加功能为DAC1_OUT1&#xff0c;无需映射&#xff0c;直接将它配置为模拟功能&#xff0c;就可以使用了。 PA6的附加功能为DAC2_OUT1&#xff0c;无需映射&#xff0c;直接将…

数据结构-栈、队列-详解

数据结构-栈、队列-详解 1.前言2.栈2.1是什么2.2函数实现struct StackStackInitStackDestroyStackPushStackSizeStackEmptyStackTopStackPop 2.3小结 3.队列3.1是什么3.2函数实现struct QueueQueueInitQueueDestroyQueueEmptyQueuePushQueuePopQueueFrontQueueBackQueueSize 3.…

Verilog基础,原码,反码与补码的概念

Verilog模块初认识 1、Verilog模块(Module) Verilog中的module可以看成一个具有输入输出端口的黑盒子&#xff0c;该黑盒子有输入和输出接口(信号)&#xff0c;通过把输入在盒子中执行某些操作来实现某项功能。(类似于C语言中的函数) 图1 模块示意图 1.1 模块描述 图1 所示的…

【408DS算法题】035进阶-17年真题_二叉树转中缀表达式

Index 真题题目分析实现总结 真题题目 请设计一个算法&#xff0c;将给定的表达式树&#xff08;二叉树&#xff09;转换为等价的中缀表达式&#xff08;通过括号反映操作符的计算次序&#xff09;并输出。 例如&#xff0c; 当下列两棵表达式树作为算法的输入时&#xff0c; …

vivado 定义约束设置和文件

步骤2&#xff1a;定义约束集和文件 首先创建一个新的约束集&#xff0c;并向其中添加一个空的XDC约束文件 示例设计已经包含两个约束集&#xff0c;但您没有在本实验室中使用它们。 1.在“流导航器”中&#xff0c;单击“项目管理器”部分中的“添加源”。 2.从“添加源”对话…

【自考zt】【软件工程】【21.10】

关键字&#xff1a; 软件需求基本性质、软件系统需求挑战、耦合&#xff08;高内容&#xff0c;低无直接&#xff09;、内聚&#xff08;初始化时间&#xff09;、uml包、rup边界类、测试首要目标、单元测试最后工作、性能需求 软件开发本质、软件需求规约三种风格、提炼、用…

windows C++ 并行编程-并发和UWP(二)

下面例程用于演示在UWP中进行并发编程。 示例: 创建 C Windows 运行时组件并从 C# 中使用它 假设有一个使用 XAML 和 C# 的应用&#xff0c;可用它来定义 UI 和 C Windows 运行时组件以执行计算密集型操作。 在此示例中&#xff0c;C 组件会计算给定范围中的哪些数字是质数。…

Sqoop 数据迁移

Sqoop 数据迁移 一、Sqoop 概述二、Sqoop 优势三、Sqoop 的架构与工作机制四、Sqoop Import 流程五、Sqoop Export 流程六、Sqoop 安装部署6.1 下载解压6.2 修改 Sqoop 配置文件6.3 配置 Sqoop 环境变量6.4 添加 MySQL 驱动包6.5 测试运行 Sqoop6.5.1 查看Sqoop命令语法6.5.2 测…

Maven与Gradle差异

作为Java 开发者&#xff0c;你平时用 Maven 还是 Gradle&#xff1f; 我一直用的都是 Maven&#xff0c;但是前几天做了一个小项目&#xff0c;用的是 Gradle&#xff0c;因工作需要就去了解了Gradle的相关信息。 直到看到 Spring 和 Spring Boot 都从 Maven 切换到 Gradle了…

鸿蒙界面开发——组件(4):图标小符号 (SymbolGlyph/SymbolSpan) 气泡提示Popup

SymbolGlyph 创建图标 SymbolGlyph通过引用Resource资源来创建&#xff0c;资源引用类型可以通过$r创建Resource类型对象。不支持子组件。 SymbolGlyph(value?: Resource)SymbolGlyph($r(sys.symbol.ohos_folder_badge_plus)).fontSize(96).renderingStrategy(SymbolRenderi…

【GD32】---- 使用GD32调试串口并实现printf打印输出

1 复制工程模板 直接复制工程模板里的系统文件和固件库文件到新的工程文件01_USART_Printf 2 新建keil工程 参考上一篇博文&#xff1a;【GD32】---- 移植工程模板及点灯测试 3 编写代码 3.1 创建USART文件 创建一个USART.c文件&#xff0c;放于05_UserDriver文件夹中 …