前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2024-01-20:用go语言,小扣在探索丛林的过程中,无意间发现了传说中“落寞的黄金之都“, 而在这片建筑废墟的地带中,小,

2024-01-20:用go语言,小扣在探索丛林的过程中,无意间发现了传说中“落寞的黄金之都“, 而在这片建筑废墟的地带中,小,

作者头像
福大大架构师每日一题
发布2024-01-20 14:39:36
1520
发布2024-01-20 14:39:36
举报

2024-01-20:用go语言,小扣在探索丛林的过程中,无意间发现了传说中"落寞的黄金之都",

而在这片建筑废墟的地带中,小扣使用探测仪监测到了存在某种带有「祝福」效果的力场,

经过不断的勘测记录,小扣将所有力场的分布都记录了下来,

forceField[i] = [x,y,side] ,

表示第 i 片力场将覆盖以坐标 (x,y) 为中心,边长为 side 的正方形区域。

若任意一点的 力场强度 等于覆盖该点的力场数量。

请求出在这片地带中 力场强度 最强处的 力场强度。

注意:力场范围的边缘同样被力场覆盖。

输入: forceField = [[0,0,1],[1,0,1]]。

输出:2。

来自lc的LCP 74. 最强祝福力场。

答案2024-01-20:

来自左程云。

灵捷3.5

大体过程如下:

1.定义一个变量n表示力场数量,初始化为forceField的长度。

2.创建两个空数组xsys,长度为n*2,用于存储力场覆盖区域的边界坐标。

3.遍历forceField,对于每个力场,将其中心坐标以及边长转换成边界坐标,并保存到xsys中。

4.对xsys进行排序。

5.去除xsys中的重复元素,并分别记录剩余元素的数量,得到sizexsizey

6.创建二维数组diff,大小为(sizex+2) x (sizey+2),用于记录每个力场的覆盖数量。

7.遍历forceField,对于每个力场,找到其在xsys中对应的边界索引,并根据索引更新diff数组。

8.初始化变量ans为0,用于记录最大的力场强度。

9.使用动态规划的思想,从diff[1][1]开始遍历diff数组,依次计算每个位置的力场强度,并更新ans

10.返回ans作为最大的力场强度。

总的时间复杂度:O(nlogn),其中n为力场数量,排序的时间复杂度为O(nlogn)。

总的额外空间复杂度:O(n),存储了xsys数组。

go完整代码如下:

代码语言:javascript
复制
package main

import (
    "fmt"
    "sort"
)

func fieldOfGreatestBlessing(forceField [][]int) int {
    n := len(forceField)
    xs := make([]int64, n*2)
    ys := make([]int64, n*2)
    for i := 0; i < n; i++ {
        x := int64(forceField[i][0])
        y := int64(forceField[i][1])
        r := int64(forceField[i][2])
        xs[i*2] = (x << 1) - r
        xs[i*2+1] = (x << 1) + r
        ys[i*2] = (y << 1) - r
        ys[i*2+1] = (y << 1) + r
    }
    sort.Slice(xs, func(i, j int) bool { return xs[i] < xs[j] })
    sort.Slice(ys, func(i, j int) bool { return ys[i] < ys[j] })
    sizex := removeDuplicates(xs)
    sizey := removeDuplicates(ys)
    diff := make([][]int, sizex+2)
    for i := range diff {
        diff[i] = make([]int, sizey+2)
    }
    for i := 0; i < n; i++ {
        x := int64(forceField[i][0])
        y := int64(forceField[i][1])
        r := int64(forceField[i][2])
        a := binarySearch(xs, (x<<1)-r)
        b := binarySearch(ys, (y<<1)-r)
        c := binarySearch(xs, (x<<1)+r)
        d := binarySearch(ys, (y<<1)+r)
        set(diff, a, b, c, d)
    }
    ans := 0
    for i := 1; i < len(diff); i++ {
        for j := 1; j < len(diff[0]); j++ {
            diff[i][j] += diff[i-1][j] + diff[i][j-1] - diff[i-1][j-1]
            ans = max(ans, diff[i][j])
        }
    }
    return ans
}

func removeDuplicates(nums []int64) int {
    size := 1
    for i := 1; i < len(nums); i++ {
        if nums[i] != nums[size-1] {
            nums[size] = nums[i]
            size++
        }
    }
    return size
}

func binarySearch(nums []int64, v int64) int {
    l, r := 0, len(nums)-1
    var m, ans int
    for l <= r {
        m = (l + r) / 2
        if nums[m] >= v {
            ans = m
            r = m - 1
        } else {
            l = m + 1
        }
    }
    return ans + 1
}

func set(diff [][]int, a, b, c, d int) {
    diff[a][b] += 1
    diff[c+1][d+1] += 1
    diff[c+1][b] -= 1
    diff[a][d+1] -= 1
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func main() {
    forceField := [][]int{{0, 0, 1}, {1, 0, 1}}
    result := fieldOfGreatestBlessing(forceField)
    fmt.Println(result)
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大体过程如下:
  • go完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档