golang力扣leetcode 第 284 场周赛

简介: golang力扣leetcode 第 284 场周赛

前言

https://leetcode-cn.com/contest/weekly-contest-284

第一次做力扣的周赛,一共4题写出3题,感觉第四题是可以做出来的,但是大一用的是c++写spfa最短路,周赛的时候都忘了,最后通过看以前的模板补上了,现在看看hard题还是挺简单的,题目描述很垃圾,令人费解。

令人惊喜的是,4题居然都是双一百,离谱

第一题

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

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

题解

简单题,,就按照题目写代码即可

代码

func findKDistantIndices(nums []int, key int, k int) (ans []int) {
  mp := make(map[int]int)
  for i, v := range nums {
    if v == key {
      mp[i] = v
    }
  }
  for i, _ := range nums {
    for mpK := range mp {
      if abs(i, mpK) <= k {
        ans = append(ans, i)
        break
      }
    }
  }
  return
}
func abs(i, j int) int {
  if i-j > 0 {
    return i - j
  }
  return j - i
}

第二题

2201.统计可以提取的工件

2201.统计可以提取的工件

题解

中等题,其实也是简单题,其实一共就4中情况,上下n个,左右n个,1个,正方形4个,if判断一下即可

代码

func digArtifacts(n int, artifacts [][]int, dig [][]int) (ans int) {
  a := make([][]int, n)
  for i := range a {
    a[i] = make([]int, n)
  }
  for _, v := range dig {
    x, y := v[0], v[1]
    a[x][y]++
  }
  for _, v := range artifacts {
    x1, y1 := v[0], v[1]
    x2, y2 := v[2], v[3]
    if x1 == x2 && y1 == y2 { //1
      if a[x1][y1] > 0 {
        ans++
      }
    } else if x1 != x2 && y1 == y2 { //左右 n
      f := true
      for i := x1; i <= x2; i++ {
        if a[i][y1] == 0 {
          f = false
          break
        }
      }
      if f{
        ans++
      }
    } else if x1 == x2 && y1 != y2 { //上下 n
      f := true
      for i := y1; i <= y2; i++ {
        if a[x1][i] == 0 {
          f = false
          break
        }
      }
      if f{
        ans++
      }
    } else if x1 != x2 && y1 != y2 { //4
      if a[x1][y1] > 0 && a[x2][y2] > 0 && a[x1][y2] > 0 && a[x2][y1] > 0 {
        ans++
      }
    }
  }
  return ans
}

第三题

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

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

题解

贪心,第一眼就是贪心,后面想着要不用dfs试试?发现dfs涉及到回溯的状态,太过复杂,而且是中等题,应该是贪心

只有一个数字,并且k是奇数,则不能放回,即-1
只有一个数字,k是偶数,或者k=0,那么就是这个数字
k=1且len>1,只能移除第一个,则答案就是第二个
如果k小于总个数,则能够遍历到的是0~k-2(移除+放回)和 k(前k个全移除)
如果k等于总个数,则能够遍历到的是0~k-2(移除+放回),不能移除前k个,不然slice就是空了
如果k大于总个数,那么每个都可以遍历到

代码

func maximumTop(nums []int, k int) (ans int) {
  if len(nums) == 1 && k%2 == 1 {//只有一个数字,并且k是奇数,则不能放回,即-1
    return -1
  }
  if len(nums) == 1 && k%2 == 0 || k == 0 {//只有一个数字,k是偶数,或者k=0,那么就是这个数字
    return nums[0]
  }
  if len(nums) >= 2 && k == 1 {//k=1,只能移除第一个,则答案就是第二个
    return nums[1]
  }
  if len(nums) > k {//如果k小于总个数,则能够遍历到的是0~k-2(移除+放回)和 k(前k个全移除)
    for i := 0; i <= k-2; i++ {
      ans = max(ans, nums[i])
    }
    return max(ans, nums[k])
  }
  if len(nums) == k {//如果k等于总个数,则能够遍历到的是0~k-2(移除+放回),不能移除前k个,不然slice就是空了
    for i := 0; i <= k-2; i++ {
      ans = max(ans, nums[i])
    }
    return ans
  }
  if k > len(nums) {//如果k大于总个数,那么每个都可以遍历到
    for i := 0; i <= len(nums)-1; i++ {
      ans = max(ans, nums[i])
    }
    return ans
  }
  return
}
func max(i, j int) int {
  if i > j {
    return i
  }
  return j
}

第四题

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

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

题解

题目描述真的很烂,其实就是给3个点 src1 ,src2 和 dest,求src1能够到达dest,并且src2能够达到dest的两条线路加一起的最小边权。

思路就是,src1跑一遍spfa,则src1到各个点的距离都出来了,src2同理,dest跑反图,即a->b变成a<-b,如果src1和src2到了某一个点,如果某一个点可以到达dest,则就节省了一段路程,即求src1->x +src2->x + dest->x的最小距离,其实如果没有公共点,那么公共点就是dest,即src1->dest+src2->dest,思路其实很清晰,对于写过最短路的来说,这题hard题不算难,但是样例有点坑的,数据规模很大,我之前用INF都是0x3f3f3f3f,没想到会超过这个数值,并且边最大是10的5次乘以10的5次,所以要用链式向前星去存,不能看二维矩阵,不然就oom了

代码

type node struct {
  v, w int
}
func minimumWeight(n int, edges [][]int, src1 int, src2 int, dest int) int64 {
  e := make([][]node, n)
  eR := make([][]node, n)
  for _, edge := range edges {
    u, v, w := edge[0], edge[1], edge[2]
    e[u] = append(e[u], node{v, w})
    eR[v] = append(eR[v], node{u, w})
  }
  INF := math.MaxInt64
  var SPFA func(e [][]node, s int) []int
  SPFA = func(e [][]node, s int) []int {
    dst := make([]int, n)
    vis := make([]int, n)
    for i := range dst {
      dst[i] = INF
    }
    dst[s] = 0
    queue := make([]node, 0)
    queue = append(queue, node{s, 0})
    for len(queue) > 0 {
      u := queue[0].v
      queue = queue[1:]
      vis[u] = 0
      for _, nodeV := range e[u] {
        v, w := nodeV.v, nodeV.w
        if dst[v] > dst[u]+w {
          dst[v] = dst[u] + w
          if vis[v] == 0 {
            queue = append(queue, node{v, dst[v]})
            vis[v] = 1
          }
        }
      }
    }
    return dst
  }
  s1 := SPFA(e, src1)
  s2 := SPFA(e, src2)
  s3 := SPFA(eR, dest)
  for i := 0; i < n; i++ {
    if s1[i] != math.MaxInt64 && s2[i] != math.MaxInt64 && s3[i] != math.MaxInt64 {
      INF = min(INF, s1[i]+s2[i]+s3[i])
    }
  }
  if INF == math.MaxInt64 {
    return -1
  }
  return int64(INF)
}
func min(i, j int) int {
  if i < j {
    return i
  }
  return j
}


目录
打赏
0
0
0
0
10
分享
相关文章
|
1天前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
20 4
|
7天前
|
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
40 9
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
111 1
|
6月前
|
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
147 0
|
6月前
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
54 0
|
7月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
226 4
Golang语言之管道channel快速入门篇
|
7月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
111 4
Golang语言文件操作快速入门篇
|
7月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
194 3
Golang语言之gRPC程序设计示例
|
7月前
|
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
148 4
|
7月前
|
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
246 4
Golang语言goroutine协程篇

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等