Leetcode - 139双周赛

目录

一,3285. 找到稳定山的下标

二,3286. 穿越网格图的安全路径

三,3287. 求出数组中最大序列值

四,3288. 最长上升路径的长度


一,3285. 找到稳定山的下标

本题就是找[0, n-2]中,height[i] 小于 threshold 的所有下标,直接枚举,代码如下:

class Solution {
    public List<Integer> stableMountains(int[] height, int threshold) {
        List<Integer> ans = new ArrayList<>();
        for(int i=0; i<height.length-1; i++){
            if(height[i] > threshold)
                ans.add(i+1);
        }
        return ans;
    }
}

二,3286. 穿越网格图的安全路径

本题就是一道求从起点到终点的最短边权,是一道经典的djstra问题,只不过这里是使用(x,y)这样的坐标来表示当前位置,代码如下:

class Solution {
    int[][] dirct = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
    public boolean findSafeWalk(List<List<Integer>> grid, int health) {
        int m = grid.size(), n = grid.get(0).size();
        int[][] dis = new int[m][n];//(0,0)->(i,j)的安全路线
        for(int i=0; i<m; i++) Arrays.fill(dis[i], Integer.MAX_VALUE/2);
        PriorityQueue<int[]> que = new PriorityQueue<>((x,y)->x[0]-y[0]);
        que.add(new int[]{grid.get(0).get(0), 0, 0});
        dis[0][0] = grid.get(0).get(0);
        while(!que.isEmpty()){
            int[] t = que.poll();
            if(t[0] != dis[t[1]][t[2]]) continue;
            for(int[] d : dirct){
                int x = t[1] + d[0], y = t[2] + d[1];
                if(x>=0 && x<m && y>=0 && y<n){
                    if(dis[t[1]][t[2]] + grid.get(x).get(y) < dis[x][y]){
                        dis[x][y] = dis[t[1]][t[2]] + grid.get(x).get(y);
                        que.add(new int[]{dis[x][y], x, y});
                    }
                }
            }
        }
        return dis[m-1][n-1] < health;
    } 
}

但是题目中说,边权仅为0 / 1,所以我们可以使用双端队列来模拟最小堆,可以节约一些时间,代码如下:

class Solution {
    int[][] dirct = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
    public boolean findSafeWalk(List<List<Integer>> grid, int health) {
        ArrayDeque<int[]> que = new ArrayDeque<>();
        que.add(new int[]{0, 0});
        int m = grid.size(), n = grid.get(0).size();
        int[][] dis = new int[m][n];//(0,0)->(i,j)的安全路线
        for(int i=0; i<m; i++) Arrays.fill(dis[i], Integer.MAX_VALUE/2);
        dis[0][0] = grid.get(0).get(0);
        while(!que.isEmpty()){
            int[] t = que.poll();
            for(int[] d : dirct){
                int x = t[0] + d[0], y = t[1] + d[1];
                if(x>=0 && x<m && y>=0 && y<n){
                    if(dis[t[0]][t[1]] + grid.get(x).get(y) < dis[x][y]){
                        dis[x][y] = dis[t[0]][t[1]] + grid.get(x).get(y);
                        if(grid.get(x).get(y) == 0)
                            que.addFirst(new int[]{x, y});
                        else
                            que.addLast(new int[]{x, y});
                    }
                }
            }
        }
        return dis[m-1][n-1] < health;
    } 
}

三,3287. 求出数组中最大序列值

由于本题是数据范围较小,所以我们可以暴力求出左半边和右半边的所有子序列进行或运算得到的值,再通过枚举中间位置来求出 x ^ y 的最大值。

这里的主要问题就是如何计算出左半边和右半边能得到的所有或值,我们可以定义一个f[i][j][x]:表示能否从前 i 个数中选择 j 个数,且或值恰好为 x。

  • 不选 v = nums[i],f[i+1][j][x] = f[i][j-1][x]
  • 选 v = nums[i],f[i+1][j][x|v] = f[i+1][j][x|v] or f[i][j-1][x]

代码如下:

class Solution {
    public int maxValue(int[] nums, int k) {
        int n = nums.length;
        int MX = 1<<7;
        boolean[][][] pre = new boolean[n+1][k+1][1<<7];
        for(int i=0; i<=n; i++) pre[i][0][0] = true;
        for (int i=0; i<n; i++){
            int v = nums[i];
            for (int j=1; j<=k; j++){
                for (int x=0; x<MX; x++){   
                    pre[i+1][j][x] |= pre[i][j][x];
                    pre[i+1][j][x|v] |= pre[i][j-1][x];
                }
            }
        }
        boolean[][][] suf = new boolean[n+1][k+1][1<<7];
        for(int i=0; i<=n; i++) suf[i][0][0] = true;
        for (int i=n-1; i>=0; i--){
            int v = nums[i];
            for (int j=1; j<=k; j++){
                for (int x=0; x<MX; x++){
                    suf[i][j][x] |= suf[i+1][j][x];
                    suf[i][j][x|v] |= suf[i+1][j-1][x];
                }
            }
        }
        int ans = 0;
        for(int i = k - 1; i < n - k; i++){
            for(int x = 0; x < MX; x++){
                if(pre[i + 1][k][x]){
                    for(int y = 0; y < MX; y++){
                        if(suf[i + 1][k][y]){
                            ans = Math.max(ans, x ^ y);
                        }
                    }
                }
            }
        }
        return ans;
    }
}

四,3288. 最长上升路径的长度

本题就是求最长上升子序列的题,只不过这里改成了坐标的形式,我们需要先给坐标按横坐标排序,在使用二分,但是需要注意的点是,可能存在有多个点,它们的横坐标相同,如果在横坐标相同时,纵坐标从小到大来排序,那么在计算的时候会重复计算,但是题目要求每个横纵坐标都要大于前一个点才算是上升序列,所以我们在横坐标相同时,纵坐标从大到小来排序,这样一来每个横坐标就只会计算一个纵坐标的点。

代码如下:

class Solution {
    public int maxPathLength(int[][] c, int k) {
        int n = c.length;
        int a = c[k][0], b = c[k][1];
        Arrays.sort(c, (x, y)->x[0]==y[0]?y[1]-x[1]:x[0]-y[0]);
        int[] f = new int[n+1];
        int ret = 0;
        for(int[] t : c){
            if(t[0] < a && t[1] < b || t[0] > a && t[1] > b){
                if(ret == 0 || f[ret] < t[1]){
                    f[++ret] = t[1];
                }else{
                    int l = 1, r = ret;
                    while(l <= r){
                        int mid = (l + r) / 2;
                        if(f[mid] < t[1]) l = mid + 1;
                        else r = mid - 1;
                    }
                    f[l] = t[1]; 
                }
            }
        }
        return ret + 1;
    }
}

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

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

相关文章

升级你的HarmonyOS体验:一窥功能引导与拖拽交换的独家技巧

文章目录 前言项目目录结构开发流程主要步骤讲解关键配置Index.ets 页面讲解高光组件相关HeaderApp 总结 前言 在当今的移动应用开发领域&#xff0c;为了提供更加友好和直观的用户体验&#xff0c;开发者们通常会集成多种交互功能来增强应用的互动性和易用性。在这些功能中&a…

故障诊断│GWO-DBN灰狼算法优化深度置信网络故障诊断

1.引言 随着人工智能技术的快速发展&#xff0c;深度学习已经成为解决复杂问题的热门方法之一。深度置信网络&#xff08;DBN&#xff09;作为深度学习中应用比较广泛的一种算法&#xff0c;被广泛应用于分类和回归预测等问题中。然而&#xff0c;DBN的训练过程通常需要大量的…

go 读取excel数据存储到mysql

一、安装依赖 go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx 二、main.go package mainimport ("fmt""github.com/jmoiron/sqlx""log" ) import "github.com/tealeg/xlsx" import _ "github.com/go-s…

【LeetCode热题100】位运算

这篇博客先介绍了常见位运算操作&#xff0c;然后记录了关于位运算的几道题&#xff0c;包括判定字符是否唯一、丢失的数字、两整数之和、只出现一次的数字2、消失的两个数字。 在这一部分&#xff0c;我们不妨先来总结一下常见位运算操作&#xff1a; 1.基础位运算 >>…

C++——模拟实现string

1.再谈string string为什么要被设计成模板&#xff1f;日常使用string好像都是char*&#xff0c;char*不够使用吗&#xff0c;为什么要设计成模板呢&#xff1f; 1.1 关于编码 //计算机的存储如何区分呢&#xff1f;int main() {//比如在C语言中&#xff0c;有整型//如果是有…

craco-less使用问题

craco-less使用问题 问题背景 前端是用React搭建&#xff0c;使用craco配置&#xff0c;相关库或插件版本如下 "craco/craco": "^7.1.0","react-scripts": "^5.0.1","craco-less": "^3.0.1"在生产环境&#xff…

P9235 [蓝桥杯 2023 省 A] 网络稳定性

*原题链接* 最小瓶颈生成树题&#xff0c;和货车运输完全一样。 先简化题意&#xff0c; 次询问&#xff0c;每次给出 &#xff0c;问 到 的所有路径集合中&#xff0c;最小边权的最大值。 对于这种题可以用kruskal生成树来做&#xff0c;也可以用倍增来写&#xff0c;但不…

国内可以使用的ChatGPT服务【9月持续更新】

首先基础知识还是要介绍得~ 一、模型知识&#xff1a; GPT-4o&#xff1a;最新的版本模型&#xff0c;支持视觉等多模态&#xff0c;OpenAI 文档中已经更新了 GPT-4o 的介绍&#xff1a;128k 上下文&#xff0c;训练截止 2023 年 10 月&#xff08;作为对比&#xff0c;GPT-4…

SSM+vue音乐播放器管理系统

音乐播放器管理系统 随着社会的发展&#xff0c;计算机的优势和普及使得音乐播放器管理系统的开发成为必需。音乐播放器管理系统主要是借助计算机&#xff0c;通过对首页、音乐推荐、付费音乐、论坛信息、个人中心、后台管理等信息进行管理。减少管理员的工作&#xff0c;同时…

2024短剧系统开发,付费短剧小程序app源码教程,分销功能讲解搭建上线

短剧系统技术栈 前端&#xff1a;vue3uniapp 后端&#xff1a; php 数据库&#xff1a;mysql 服务器环境&#xff1a; centos7.6 宝塔 php7.4 MySQL5.7 一、短剧系统功能 短剧用户端&#xff1a; 小程序、抖音小程序、快手小程序、APP、 z付宝小程序 系统用户端详细功能&…

有关shell指令练习2

写一个shell脚本&#xff0c;将以下内容放到脚本中 在家目录下创建目录文件&#xff0c;dir dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz移动到dir1中 …

ABAP-Swagger 一种公开 ABAP REST 服务的方法

ABAP-Swagger An approach to expose ABAP REST services 一种公开 ABAP REST 服务的方法 Usage 1: develop a class in ABAP with public methods 2: implement interface ZIF_SWAG_HANDLER, and register the public methods(example method zif_swag_handler~meta) 3: …

nonlocal本质讲解(前篇)——从滤波到Nonlocal均值滤波

线性滤波 → \rightarrow →高斯滤波 → \rightarrow →高斯滤波 → \rightarrow →双边滤波 → \rightarrow →Nonlocal均值滤波 平均 高斯 双边 Nonlocal 目录 线性滤波高斯滤波双边滤波Nonlocal均值滤波 滤波最初是频域的概念&#xff0c;由于频域乘积对应空域卷积&am…

药物分子生成算法综述:从生成对抗网络到变换器模型的多样化选择

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 基于已有的药物数据生成新的药物分子是一项复杂的任务&#xff0c;通常涉及到生成模型和机器学习算法。以下是一些常用的算法和方法&#xff1a; 1. 生成对抗网络 (GANs) 特点: 由生成…

罗马数字详解

一. 罗马数字の背景 1. 罗马数字的诞生与进化 罗马数字起源于古罗马帝国&#xff0c;拥有一个漫长而复杂的历史&#xff0c;始于公元前 8 世纪至 9 世纪&#xff0c;与古罗马帝国在帕兰丁山&#xff08;Palantine Hill&#xff09;周围建立的时间大致相同。不过&#xff0c;罗…

【GUI设计】基于Matlab的图像处理GUI系统(2),matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像处理GUI系统&#xff08;2&#xff09;&#xff0c;用matlab实现。…

jboss

一。CVE-2015-7501 1.POC&#xff0c;访问地址 192.168.10.193:8080/invoker/JMXInvokerServlet 返回如下&#xff0c;说明接⼝开放&#xff0c;此接⼝存在反序列化漏洞 2.下载 ysoserial ⼯具进⾏漏洞利⽤ https://github.com/frohoff/ysoserial 将反弹shell进⾏base64编码…

java重点学习-设计模式

十三 设计模式 工厂模式&#xff1a;spring中使用&#xff08;目的是&#xff1a;解耦&#xff09; 1.简单工厂 所有的产品都共有一个工厂&#xff0c;如果新增产品&#xff0c;则需要修改代码&#xff0c;违反开闭原则是一种编程习惯&#xff0c;可以借鉴这种编程思路 2.工厂方…

基于SpringBoot+WebSocket实现地图上绘制车辆实时运动轨迹图

实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spring Boot&#xff1a;作为后端框架&#xff0c;用来提供数据接口。Thymeleaf&#xff1a;作为前端模板引擎&#xff0c;呈现网页。Leaflet…

Java律师法律咨询小程序

技术&#xff1a;Java、Springboot、mybatis、Vue、Mysql、微信小程序 1.代码干净整洁&#xff0c;可以快速二次开发和添加新功能 2.亮点可以添加AI法律咨询作为 创新点 系统分&#xff1a;用户小程序端&#xff0c;律师web端和管理员端 用户可以在小程序端登录系统进入首…