leetcode第 284 场周赛(AC 3道,排名818 / 8483)

2023-05-16

题目

  1. 找出数组中的所有 K 近邻下标
  2. 统计可以提取的工件
  3. K 次操作后最大化顶端元素
  4. 得到要求路径的最小带权子图

题解

只做出来前3道,最后一题只知道用dijkstra算法,但没有太多时间进一步考虑,还是不够熟练。

6031 找出数组中的所有 K 近邻下标

class Solution:
    def findKDistantIndices(self, nums: List[int], key: int, k: int) -> List[int]:
        key_index = []
        for i in range(len(nums)):
            if nums[i]==key:
                key_index.append(i)
        
        ret_set = set()
        for index in key_index:
            for i in range(index-k, index+k+1):
                if 0<=i<len(nums):
                    ret_set.add(i)
        return list(ret_set)

5203 统计可以提取的工件

class Solution:
    def digArtifacts(self, n: int, artifacts: List[List[int]], dig: List[List[int]]) -> int:
        dig_set = set(((l[0],l[1]) for l in dig))
        ret = 0
        for art in artifacts:
            r1i, c1i, r2i, c2i = art
            flag = True
            for r in range(r1i, r2i+1):
                for c in range(c1i, c2i+1):
                    if (r, c) not in dig_set:
                        flag = False
                        break
                if not flag:
                    break
            if flag:
                ret += 1
        return ret

5227 K 次操作后最大化顶端元素

class Solution:
    def maximumTop(self, nums: List[int], k: int) -> int:
        n = len(nums)
        min_val, max_val = min(nums), max(nums)
        
        # 元素全部相等,可能出现空栈的情况
        if min_val==max_val:
            if k>=n and (k-n)&1==0:
                return -1
            else:
                return max_val
        
        if k>n:
            return max_val
        
        if k==0:
            return nums[0]
        
        if k==1:
            return nums[1]
        
        nums.append(-1)
        pre_max = max(nums[:k-1])
        return max(pre_max, nums[k])

6032 得到要求路径的最小带权子图

class Solution:
    def minimumWeight(self, n: int, edges: List[List[int]], src1: int, src2: int, dest: int) -> int:
        def dijkstra(src, w):
            dist = [float('inf') for _ in range(n)]
            dist[src] = 0
            
            visited = [False for _ in range(n)]
            
            for _ in range(n):
                min_dist = float('inf')
                min_i = -1
                for i in range(n):
                    if not visited[i] and dist[i]<min_dist:
                        min_dist = dist[i]
                        min_i = i
                
                visited[min_i] = True
                for i in range(n):
                    dist[i] = min(dist[i], min_dist + w[min_i][i])
            return dist
                
            
        w = [[float('inf') for _ in range(n)] for _ in range(n)]
        for i in range(n):
            w[i][i] = 0
        for e in edges:
            w[e[0]][e[1]] = min(w[e[0]][e[1]], e[2])
        
        dist1 = dijkstra(src1, w)
        dist2 = dijkstra(src2, w)
        
        w_1_dest = dist1[dest]
        w_2_dest = dist2[dest]
        w_1_2 = dist1[src2]
        w_2_1 = dist2[src1]
        
        if w_1_dest==float('inf') or w_2_dest==float('inf'):
            return -1
        
        ret = w_1_dest + w_2_dest
        
        if w_1_2 < float('inf'):
            ret = min(w_1_2 + w_2_dest, ret)
        
        if w_2_1 < float('inf'):
            ret = min(w_2_1 + w_1_dest, ret)
        
        return ret

就这已经超时了。看到大神的答案,应该用3次dijkstra,最后一次是反向的。
在这里插入图片描述
难得见到一个排行榜前列用python的 @pku_erutan:

class CGraph_weight() :
    def __init__(self, edges) :
        self.link_dict = collections.defaultdict(dict)

        for s, e, w in edges :
            if e in self.link_dict[s] :
                self.link_dict[s][e] = min(self.link_dict[s][e], w)
            else :
                self.link_dict[s][e] = w

    def bfs(self, source) :
        """
        单源最短路径
        """
        visited = {}
        to_visit = [[0, source]]

        while len(to_visit) > 0 :
            cost, pnow = heapq.heappop(to_visit)
            if pnow in visited:
                continue
            visited[pnow] = cost

            for pnext in self.link_dict[pnow] :
                if pnext in visited :
                    continue
                heapq.heappush(to_visit, [cost+self.link_dict[pnow][pnext], pnext])
        return visited
class Solution:
    def minimumWeight(self, n: int, edges: List[List[int]], src1: int, src2: int, dest: int) -> int:
        
        cgraph = CGraph_weight(edges)
        rcgraph = CGraph_weight([[t, s, w] for s, t, w in edges])
        dis1 = cgraph.bfs(src1)
        dis2 = cgraph.bfs(src2)
        dist = rcgraph.bfs(dest)
        print(dis1)
        print(dis2)
        print(dist)
        to_ret = 1e99
        for mid in range(n) :
            if not mid in dis1 or not mid in dis2 or not mid in dist :
                continue
            to_ret = min(to_ret, dis1[mid]+dis2[mid]+dist[mid])
        if to_ret > 1e88 :
            return -1
        return to_ret

榜一@RobeZH的C++解法很漂亮,学习了:

#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define subnb true
#define Lnb true
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
const ll INF = (ll)1e18;

class Solution {
public:
    struct edge {
        int to, cost;
    };
    vector<vector<edge>> G, rG;

    vector<ll> dijkstra(int s, int n, vector<vector<edge>> &S) {
        vector<ll> dist(n, INF);
        dist[s] = 0;
        priority_queue<pll, vector<pll>, greater<pll> > pque;
        pque.push({0, s});
        while(!pque.empty()) {
            auto p = pque.top(); pque.pop();
            ll v = p.second, d = p.first;
            if(dist[v] < d) continue;
            for (auto &e : S[v]) {
                if(dist[e.to] > dist[v] + e.cost) {
                    dist[e.to] = dist[v] + e.cost;
                    pque.push({dist[e.to], e.to});
                }
            }
        }
        return dist;
    }

    long long minimumWeight(int n, vector<vector<int>>& edges, int src1, int src2, int dest) {
        G = vector<vector<edge>>(n);
        rG = vector<vector<edge>>(n);
        for (auto &v : edges) {
            G[v[0]].push_back({v[1], v[2]});
            rG[v[1]].push_back({v[0], v[2]});
        }
        auto dsrc1 = dijkstra(src1, n, G);
        auto dsrc2 = dijkstra(src2, n, G);
        auto ddest = dijkstra(dest, n, rG);
        ll res = INF;
        rep(i, 0, n) {
            res = min(res, dsrc1[i] + dsrc2[i] + ddest[i]);
        }
        if(res >= INF) return -1;
        else return res;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode第 284 场周赛(AC 3道,排名818 / 8483) 的相关文章

随机推荐

  • 删除分节符的技巧

    WORD中删除分节符有这样的规定 xff1a 如果要删除分节符 xff0c 只要把光标移动到该分节符上 xff0c 按Delete键即可 但是要注意该分节符前面的文字将合并到后面的节中 xff0c 并且采用后者的格式设置 我就不知道天杀的微
  • 虚机创建异常报错No valid host was found,There are not enough hosts available

    虚机创建异常 xff0c 使用nova show 虚机ID提示fault报错信息 xff1a No valid host was found xff0c There are not enough hosts available 检查所在宿主
  • vuzzer 具体原理解析

    目录 1 安装 vmware 15 01环境下安装 xff1a 2 vuzzer使用说明 3 vuzzer原理 3 1权重文件以及有着cmp信息的文件生成 3 2 vuzzer种子生成 xff0c 变异原理 3 2 1 runfuzz py
  • C++ unordered_set

    目录 1 定义 2 基本的函数 2 1 unordered set构造 2 2 添加新的元素 注意无法插入相同元素 2 3 查找元素 2 4 查找桶接口 2 5 观察器 2 6 清除元素 2 7 其他函数 1 定义 unordered se
  • clang 10 介绍——sanitizerCoverage

    1 Introduction llvm内置了一个简单的代码覆盖率检测 xff08 sanitizercoverage xff09 它在函数级 基本块级和边缘级插入对用户定义函数的调用 提供了这些回调的默认实现 xff0c 并实现了简单的覆盖
  • C++ 匿名函数

    1 定义 所谓匿名函数 xff0c 其实类似于python中的lambda函数 xff0c 其实就是没有名字的函数 使用匿名函数 xff0c 可以免去函数的声明和定义 这样匿名函数仅在调用函数的时候才会创建函数对象 xff0c 而调用结束后
  • 给docker中的ubuntu系统安装桌面程序

    原本服务器是centos的 xff0c 用的不是很习惯 xff0c 也为了可以分割功能 xff0c 于是在服务器上装了docker xff0c docker里装了ubuntu系统 xff0c 具体过程可以参见https blog csdn
  • 陇剑杯 2021 write up整理

    竞赛 write up 收集和整理 陇剑杯 2021 write up整理1 签到题1 1 2 JWT2 12 22 32 42 52 6 3 webshell3 13 23 33 43 53 63 7 4 日志分析4 14 24 3 5
  • PBCTF2021

    PBCTF2021 1 MISC1 1 幽灵作家 Ghost Writer 2 Crypto2 1 Alkaloid Stream2 2 Steroid Stream2 3 good hash 1 MISC 1 1 幽灵作家 Ghost W
  • ASISCTF

    warm up 题目代码如下图所示 xff0c 我们会发现整个加密过程如下所示 xff0c 先在flag后面加上p长度的随机字符 xff0c 然后选择pow s i p 的结果选择字符重新连接字符串实现加密 usr bin env pyth
  • burpsuite简介

    1 burpsuite简介 burpsuite作为web渗透较为常用的软件 xff0c 有着9个比较常用的模块 proxy xff0c target xff0c intruder xff0c comparer xff0c repeater
  • libFuzzer

    目录 1 概述 2 版本 3 Fuzz Target 4 Fuzzer Usage 5 Corpus 6 Running 7 Parallel Fuzzing 8 Fork mode 9 Resuming merge 10 Options
  • linux virsh console无法登入虚拟机,宿主机virsh console 登录异常

    创建虚机后在宿主机上通过virsh console 登录不进去 xff0c 一直卡在登录界面 xff08 可以通过命名空间ssh登录 xff0c 排除用户名及密码问题 xff09 原因是相关配置文件没有添加 xff0c 可以通过以下方法进行
  • FrankMocap:A Monocular 3D Whole-Body Pose Estimation System via Regression and Integration 2021阅读理解

    ICCV Workshop 2021 Facebook AI research Btw why the name FrankMocap Our pipeline to integrate body and hand modules remi
  • 网络流算法学习笔记——Dinic有效算法

    屈婉玲 算法设计与分析 第2版第7章网络流算法学习笔记 概述 Dinic有效算法同样用来求最大流 xff0c 相当于FF算法的改进 FF算法参考 xff1a 网络流算法学习笔记 最大流问题基本概念和Ford Fulkerson方法 xff0
  • NDN网络学习笔记(一)——NDN基础

    NDN xff08 Named Data Networking xff09 是用来取代当前TCP IP架构的新的互联网架构 xff0c 在2010年被提出 NDN 的网络架构如下右图 xff0c 它继承了 IP 架构的沙漏型瘦腰结构 xff
  • Meterpreter session 2 closed. Reason: Died 问题解决方法

    问题描述 用msf生成Ubuntu 16 04的反向连接木马 xff1a msfvenom p linux x64 meterpreter reverse tcp LHOST span class token operator 61 spa
  • docker hub连接github无法构建镜像的问题解决

    初次使用docker hub关联github xff0c 参考官方教程 xff1a http docs docker oeynet com docker hub github creating an automated build 关联了g
  • 彻底搞懂Django静态文件管理

    为什么要管理静态文件 Django官方教程说 xff1a We recommend using a separate Web server i e one that s not also running Django for serving
  • leetcode第 284 场周赛(AC 3道,排名818 / 8483)

    题目 找出数组中的所有 K 近邻下标统计可以提取的工件K 次操作后最大化顶端元素得到要求路径的最小带权子图 题解 只做出来前3道 xff0c 最后一题只知道用dijkstra算法 xff0c 但没有太多时间进一步考虑 xff0c 还是不够熟