LeetCode第432场周赛 (前3题|多语言)

news2025/1/15 6:05:26

比赛链接:第432场周赛

文章目录

  • 3417. 跳过交替单元格的之字形遍历
    • 思路
    • 代码
      • C++
      • Java
      • Python
  • 3418. 机器人可以获得的最大金币数
    • 思路
    • 代码
      • C++
      • Java
      • Python
  • 3419. 图的最大边权的最小值
    • 思路
    • 代码
      • C++
      • Java
      • Python
  • 总结

3417. 跳过交替单元格的之字形遍历

在这里插入图片描述

思路

没啥好说的就是模拟
按照题目要求,S形遍历数组,然后从[0][0]开始,每隔一个元素就记录一下。(以i为行遍历,j为列遍历)那么就可以得知,当i为偶数时,j就是从前往后,反之从后往前。然后我们再用一个数flag来判断遍历的该元素是否是要记录的元素。

代码

C++

class Solution {
public:
    vector<int> zigzagTraversal(vector<vector<int>>& grid) {
        int n = grid.size();
        int m = grid[0].size();
        vector<int> ret;
        int num = 0;
        for(int i = 0;i<n;++i){
            if(i%2 == 0){
                for(int j = 0;j<m;++j){
                    if(num%2==0){
                        ret.push_back(grid[i][j]);
                        
                    }
                    num++;
                }
            }else{
                for(int j = m-1;j>=0;--j){
                    if(num%2==0){
                        ret.push_back(grid[i][j]);
                        
                    }
                    num++;
                }
            }
        }
        return ret;
    }
};

Java

class Solution {
    public List<Integer> zigzagTraversal(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        List<Integer> ret = new ArrayList<>();
        int flag = 0;
        for(int i = 0;i<n;++i){
            if(i%2 == 0){
                for(int j = 0;j<m;++j){
                    if(flag%2==0){
                        ret.add(grid[i][j]);
                    }else{
                        ;
                    }
                    flag++;
                }
            }else{
                for(int j = m-1;j>=0;--j){
                    if(flag%2==0){
                        ret.add(grid[i][j]);
                    }else{
                        ;
                    }
                    flag++;
                }
            }
        }
        return ret;
    }
}

Python

class Solution:
    def zigzagTraversal(self, grid: List[List[int]]) -> List[int]:
        ret=[]
        flag = 0
        for i in range(0,len(grid)):
            if i%2==0:
                for j in range(0,len(grid[0])):
                    if flag%2==0:
                        ret.append(grid[i][j])
                    else:
                        pass
                    flag+=1
            else:
                for j in range(len(grid[0])-1,-1,-1):
                    if flag%2==0:
                        ret.append(grid[i][j])
                    else:
                        pass
                    flag+=1
        return ret

3418. 机器人可以获得的最大金币数

在这里插入图片描述

思路

通过查看题目我们可以发现,如果去掉感化这一个限制条件,那么这题不就是非常典型的动态规划了吗?我们只要创建一个二维数组就可以轻松解决了。
可是现在多了一个感化的选项,如果我们只用一个二维数组肯定是无法解决问题的,二维数组能表达的信息只有到当前位置获得的最大金币数,但是没有限制。
现在我们定义一个三维数组dp[i][j][k]表示到达(i,j)位置时,已经感化k个强盗的最大金币数
状态转移
如果不感化强盗:dp[i][j][k] = max(dp[i-1][j][k],dp[i][j-1][k])+coins[i][j]
如果感化强盗:dp[i][j][k] = max(dp[i-1][j][k-1],dp[i][j-1][k-1])+0
初始状态
dp[0][0][0] = coins[0][0],如果coins[0][0]<0。那么感化dp[0][0][1] = 0

代码

C++

class Solution {
public:
    int maximumAmount(vector<vector<int>>& coins) {
        int n = coins.size(), m = coins[0].size();
        // 定义 dp 数组,dp[i][j][k] 表示到 (i, j) 位置感化了 k 个强盗的最大金币数
        vector<vector<vector<int>>> dp(n, vector<vector<int>>(m, vector<int>(3, INT_MIN)));

        // 初始化 dp[0][0] 的状态
        dp[0][0][0] = coins[0][0];
        if (coins[0][0] < 0) dp[0][0][1] = 0; // 如果起点有强盗,感化后金币为 0

        // 填充 DP 表
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                for (int k = 0; k < 3; ++k) { // k 表示已感化强盗的数量
                    if (dp[i][j][k] == INT_MIN) continue; // 无效状态跳过

                    // 向下移动
                    if (i + 1 < n) {
                        // 不感化
                        dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k] + coins[i + 1][j]);
                        // 感化
                        if (coins[i + 1][j] < 0 && k + 1 < 3) {
                            dp[i + 1][j][k + 1] = max(dp[i + 1][j][k + 1], dp[i][j][k] + 0);
                        }
                    }

                    // 向右移动
                    if (j + 1 < m) {
                        // 不感化
                        dp[i][j + 1][k] = max(dp[i][j + 1][k], dp[i][j][k] + coins[i][j + 1]);
                        // 感化
                        if (coins[i][j + 1] < 0 && k + 1 < 3) {
                            dp[i][j + 1][k + 1] = max(dp[i][j + 1][k + 1], dp[i][j][k] + 0);
                        }
                    }
                }
            }
        }

        // 返回到达终点时的最大金币数(考虑感化 0, 1, 2 个强盗的情况)
        return max({dp[n - 1][m - 1][0], dp[n - 1][m - 1][1], dp[n - 1][m - 1][2]});
    }
};

Java

class Solution {
    public int maximumAmount(int[][] coins) {
        int n = coins.length;
        int m = coins[0].length;
        int dp[][][] = new int[n][m][3];
        for(int i = 0;i<n;++i){
            for(int j = 0;j<m;++j){
                for(int k = 0;k<3;++k){
                    dp[i][j][k] = -0x3f3f3f3f;
                }
            }
        }
        dp[0][0][0] = coins[0][0];
        if(coins[0][0]<0){
            dp[0][0][1] = 0;
        }
        for(int i = 0;i<n;++i){
            for(int j = 0;j<m;++j){
                for(int k = 0;k<3;++k){
                    if(dp[i][j][k] == -0x3f3f3f3f){
                        continue;
                    }
                    if(i+1<n){
                        dp[i+1][j][k] = Math.max(dp[i+1][j][k],dp[i][j][k]+coins[i+1][j]);
                        if(coins[i+1][j]<0&&k<2){
                            dp[i+1][j][k+1] = Math.max(dp[i+1][j][k+1],dp[i][j][k]);
                        }
                    }
                    if(j+1<m){
                        dp[i][j+1][k] = Math.max(dp[i][j+1][k],dp[i][j][k]+coins[i][j+1]);
                        if(coins[i][j+1]<0&&k<2){
                            dp[i][j+1][k+1] = Math.max(dp[i][j+1][k+1],dp[i][j][k]);
                        }
                    }
                }
            }
        }
        return Math.max(Math.max(dp[n-1][m-1][0],dp[n-1][m-1][1]),dp[n-1][m-1][2]);
    }
}

Python

class Solution:
    def maximumAmount(self, coins: List[List[int]]) -> int:
        n,m = len(coins),len(coins[0])
        dp = [[[-float('inf')]*3 for _ in range(m)] for _ in range(n)]
        dp[0][0][0] = coins[0][0]
        if coins[0][0] < 0:
            dp[0][0][1] = 0
        for i in range(n):
            for j in range(m):
                for k in range(3):
                    if dp[i][j][k] == -float('inf'):
                        continue
                    #下移
                    if i+1<n:
                        dp[i+1][j][k] = max(dp[i+1][j][k],dp[i][j][k]+coins[i+1][j])
                        if(coins[i+1][j]<0 and k<2):
                            dp[i+1][j][k+1] = max(dp[i+1][j][k+1],dp[i][j][k]+0)
                    # 右移
                    if j+1<m:
                        dp[i][j+1][k] = max(dp[i][j+1][k],dp[i][j][k]+coins[i][j+1])
                        if(coins[i][j+1]<0 and k<2):
                            dp[i][j+1][k+1] = max(dp[i][j+1][k+1],dp[i][j][k]+0)
        return max(dp[i][j])

3419. 图的最大边权的最小值

本题思路来自:TsReaper

在这里插入图片描述

思路

题目有3个要求。
我们先看要求1:所有的节点都可以到达节点0,那么也就意味着0节点可以到达所有点,那么所有点最大有threshold的出度的限制,也反过来变成,所有点最大有threshold的入度。
了解完上面我们能发现,第3点条件好像不是很重要啊。当我们从0开始遍历,就会形成一个树,树的有向边从从父节点指向子节点。因为树上每个节点最多只有一个父节点,所以每个节点最多只有一个入度,一定满足条件3.
那么剩下的就是条件2了,看到让最大边权尽可能小(最大值最小)我们可以想到二分算法。因此我们可以使用二分算法,二分的判断判断条件就是检查是否能从0节点到达所有节点。
笔者使用的BFS遍历图。

代码

C++

class Solution {
public:
    int minMaxWeight(int n, vector<vector<int>>& edges, int threshold) {
        auto check = [&](int lim){
            vector<vector<int>> arr(n);
            vector<bool> vis(n,false);
            for(auto&edge:edges){
                if(edge[2]<=lim){
                    arr[edge[1]].push_back(edge[0]);
                }
            }
            queue<int> q;
            q.push(0);
            vis[0] = true;
            while(!q.empty()){
                int tmp = q.front();
                q.pop();
                for(int x:arr[tmp]){
                    if(vis[x]==false){
                        q.push(x);
                        vis[x] = true;
                    }
                }
            }
            for(bool x:vis){
                if(x == false){
                    return false;
                }
            }
            return true;
        };
        int low = 0,high = 0;
        for(auto&edge:edges){
            high = max(high,edge[2]);
        }
        if(check(high)==false){
            return -1;
        }
        while(low<high){
            int mid = (low+high)>>1;
            if(check(mid)){
                high = mid;
            }else{
                low = mid+1;
            }
        }
        return high;
    }
};

Java

class Solution {
    public int minMaxWeight(int n, int[][] edges, int threshold) {
        int low = 0,high = 0;
        for(int[] edge : edges){
            high = Math.max(high,edge[2]);
        }
        if(check(n,edges,high) == false){
            return -1;
        }
        while(low<high){
            int mid = (low+high)>>1;
            if(check(n,edges,mid)){
                high = mid;
            }else{
                low = mid+1;
            }
        }
        return high;
    }
    public boolean check(int n,int[][] edges,int lim){
        List<List<Integer>> e = new ArrayList<>();
        for(int i = 0;i<n;++i){
            e.add(new ArrayList<>());
        }
        boolean[] vis = new boolean[n];
        for(int[] edge : edges){
            if(edge[2]<=lim){
                e.get(edge[1]).add(edge[0]);
            }
        }
        Queue<Integer> q = new LinkedList<>();
        q.add(0);
        vis[0] = true;
        while(!q.isEmpty()){
            int tmp = q.remove();
            for(int x : e.get(tmp)){
                if(vis[x] == false){
                    vis[x] = true;
                    q.add(x);
                }
            }
        }
        for(boolean x : vis){
            if(x == false){
                return false;
            }
        }
        return true;

    }
}

Python

from queue import Queue
class Solution:
    def minMaxWeight(self, n: int, edges: List[List[int]], threshold: int) -> int:
        def check(lim: int):
            e = [[] for _ in range(n)]
            for edge in edges:
                if(edge[2]<=lim):
                    e[edge[1]].append(edge[0])
            vis = [False]*n
            q = Queue()
            q.put(0)
            vis[0] = True
            while(not q.empty()):
                tmp = q.get()
                for x in e[tmp]:
                    if vis[x] == False:
                        vis[x] = True
                        q.put(x)
            for x in vis:
                if x == False:
                    return False
            return True
        low,high = 0,0
        for edge in edges:
            high = max(high,edge[2])
        if check(high) == False:
            return -1
        while low<high:
            mid = (low+high)>>1
            if check(mid):
                high = mid
            else:
                low = mid+1
        return high

总结

好久没打力扣的周赛了,以后的力扣的周赛,我尽量都参加吧。
本系列主要记录我的刷题历程

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

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

相关文章

下载导出Tomcat上的excle文档,浏览器上显示下载

目录 1.前端2.Tomcat服务器内配置3.在Tomcat映射的文件内放置文件4.重启Tomcat&#xff0c;下载测试 1.前端 function downloadFile() {let pictureSourceServer "http://192.168.1.1:8080/downFile/";let fileName "测试文档.xlsx";let fileURL pictu…

蓝桥杯备赛:顺序表和单链表相关算法题详解(上)

一.询问学号&#xff08;顺序表&#xff09; 1.题目来源&#xff1a; https://www.luogu.com.cn/problem/P3156 &#xff08;洛谷原题&#xff09; 2.解析与代码实现&#xff1a; &#xff08;1&#xff09;解析&#xff1a; 首先结合题目和输出样例不难看出这道题目是围绕两…

Java 基于微信小程序的高校科研团队管理系统设计与实现(附源码,部署,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

C#,任意阶幻方(Magic Square)的算法与源代码

1 什么是幻方&#xff1f; 幻方&#xff08;Magic Square&#xff09;是一种将数字安排在正方形格子中&#xff0c;使每行、列和对角线上的数字和都相等的方法。 幻方也是一种中国传统游戏。旧时在官府、学堂多见。它是将从一到若干个数的自然数排成纵横各为若干个数的正方形&…

java求职学习day12

1 泛型机制&#xff08;熟悉&#xff09; 1.1 基本概念 &#xff08;1&#xff09;通常情况下集合中可以存放不同类型的元素&#xff0c;是因为将所有对象都看作Object类型放入&#xff0c;因此从集合中取出元素时&#xff0c;也是Object类型&#xff0c;为了表达该元素真实的…

uni-app h5修改浏览器导航栏的 title以及icon

1.title 在pages.json文件中修改:"navigationBarTitleText":"uni-app" 2.icon的修改 2.1 在static中新建一个index.html文件作为模板文件&#xff0c;并且将你的icon图片也放在static文件夹下 2.2 在index.html文件中加入如下代码&#xff08;记得icon文件…

Mac——Docker desktop安装与使用教程

摘要 本文是一篇关于Mac系统下Docker Desktop安装与使用教程的博文。首先介绍连接WiFi网络&#xff0c;然后详细阐述了如何在Mac上安装Docker&#xff0c;包括下载地址以及不同芯片版本的选择。接着讲解了如何下载基础镜像和指定版本镜像&#xff0c;旨在帮助用户在Mac上高效使…

OJ题目下篇

我们今天继续来看链表的算法题目 我们先来看第一道题&#xff1a; 这是一道牛客网的题目&#xff1a; 链表的回文结构_牛客题霸_牛客网 我们来看这道题&#xff1a;首先我们要判断是不是回文结构&#xff0c;我们之前判断过数组的回文&#xff0c;这是比较好判断的&#xff…

25/1/14 算法笔记<强化学习> CBR加强化学习

CBR,基于案例的推理&#xff0c;它是一种基于过去的实际经验或经历的推理&#xff0c;他可以根据过往的案例找到与当前案例最相关的案例&#xff0c;然后对该案例做改动来解决当前的问题。 CBR的过程 CBR可以看作一个循环过程&#xff1a;相似按键检索-->案例重用-->案…

初识JAVA-面向对象的三大特征之多态

1. 重温面向对象 面向对象是一种解决问题的思想&#xff0c;它把计算机程序看作是各种对象组合起来的。每个对象都有自己的数据&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;&#xff0c;主要依靠对象之间的交互来解决和实现问题。Java是一门纯面向对象的语…

Pytorch基础教程:从零实现手写数字分类

1.Pytorch简介 ‌PyTorch是一个开源的深度学习框架&#xff0c;由Facebook的人工智能研究院&#xff08;FAIR&#xff09;开发&#xff0c;并于2017年1月正式推出。‌ PyTorch以其灵活性和易用性著称&#xff0c;特别适合于深度学习模型的构建和训练。它基于Torch张量库开发&a…

高性能现代PHP全栈框架 Spiral

概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架&#xff0c;旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器&#xff0c;Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…

运维高级课作业三

源码编译安装httpd 2.4 首先下载好httpd-2.4.62.tar.bz2的安装包 将这个文件传入Linux中 将他解归档解入/usr/src/ rpm -e httpd --nodeps # 如果系统自带httpd这个软件要删除掉&#xff0c;两个软件不能同时运行 yum -y install apr apr-devel cyrus-sasl-devel expat-dev…

.Net8 Avalonia跨平台UI框架——<vlc:VideoView>控件播放海康监控、摄像机视频(Windows / Linux)

一、UI效果 二、新建用户控件&#xff1a;VideoViewControl.axaml 需引用&#xff1a;VideoLAN.LibVLC.Windows包 Linux平台需安装&#xff1a;VLC 和 LibVLC &#xff08;sudo apt-get update、sudo apt-get install vlc libvlccore-dev libvlc-dev&#xff09; .axaml 代码 注…

【HM-React】08. Layout模块

基本结构和样式reset 结构创建 实现步骤 打开 antd/Layout 布局组件文档&#xff0c;找到示例&#xff1a;顶部-侧边布局-通栏拷贝示例代码到我们的 Layout 页面中分析并调整页面布局 代码实现 pages/Layout/index.js import { Layout, Menu, Popconfirm } from antd impor…

Canvas简历编辑器-选中绘制与拖拽多选交互方案

Canvas简历编辑器-选中绘制与拖拽多选交互方案 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM&#xff0c;并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上&#xff0c;关注于实现选中绘制与拖拽多选交…

C# OpenCV机器视觉:转速测量

在一个看似平常却又暗藏神秘能量的日子里&#xff0c;阿杰正在他那充满科技感的实验室里&#xff0c;对着一堆奇奇怪怪的仪器发呆。突然&#xff0c;手机铃声如一道凌厉的剑气划破寂静&#xff0c;原来是工厂的赵厂长打来的紧急电话&#xff1a;“阿杰啊&#xff0c;咱们工厂新…

vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动

需求&#xff1a;有个长方形的容器&#xff0c;但是需要正方形的网格线&#xff0c;网格线是等比缩放的并且可以无线拖动的&#xff0c;并且添加自适应缩放和动态切换&#xff0c;工具是plotly.js,已完成功能如下 1.正方形网格 2.散点分组 3.自定义悬浮框的数据 4.根据窗口大小…

0基础跟德姆(dom)一起学AI 自然语言处理13-注意力机制介绍2

1 注意力机制规则 它需要三个指定的输入Q(query), K(key), V(value), 然后通过计算公式得到注意力的结果, 这个结果代表query在key和value作用下的注意力表示. 当输入的QKV时, 称作自注意力计算规则&#xff1b;当Q、K、V不相等时称为一般注意力计算规则 例子&#xff1a;seq2…

慧集通(DataLinkX)iPaaS集成平台-系统管理之UI库管理、流程模板

UI库管理 UI库管理分为平台级和自建两种&#xff0c;其中平台级就是慧集通平台自己内置的一些ui库所有客户均可调用&#xff0c;自建则是平台支持使用者自己根据规则自己新增对应的UI库。具体界面如下&#xff1a; 自建UI库新增界面&#xff1a; 注&#xff1a;平台级UI库不支…