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
}


目录
相关文章
|
1月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
1月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
78 0
|
1月前
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
29 0
|
1月前
|
存储
力扣(LeetCode)数据结构练习题
力扣(LeetCode)数据结构练习题
52 0
|
4月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
33 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
16 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口