2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系,

"y下"和"y上"表示一条无限延伸的道路,"y下"表示这个道路的下限,"y上"表示这个道路的上限,

给定一批长方形,每一个长方形有(x1, x2, y1, y2),4个坐标可以表示一个长方形,

判断这条道路整体是不是可以走通的。

以下为正式题目:

图片在计算机处理中往往是使用二维矩阵来表示的,

给你一个大小为 m x n 的二进制矩阵 image 表示一张黑白图片,0 代表白色像素,1 代表黑色像素,

黑色像素相互连接,也就是说,图片中只会有一片连在一块儿的黑色像素。像素点是水平或竖直方向连接的。

给你两个整数 x 和 y 表示某一个黑色像素的位置。

请你找出包含全部黑色像素的最小矩形(与坐标轴对齐),并返回该矩形的面积。

你必须设计并实现一个时间复杂度低于 O(m*n) 的算法来解决此问题。

输入:image = [[“0”,“0”,“1”,“0”],[“0”,“1”,“1”,“0”],[“0”,“1”,“0”,“0”]], x = 0, y = 2。

输出:6。

答案2024-02-28:

来自左程云

灵捷3.5

大体步骤如下:

1.定义一个辅助函数minArea(image [][]byte, x int, y int) int,用于计算包含全部黑色像素的最小矩形的面积。

2.在minArea函数中,使用二分查找来确定矩形的左边界、右边界、上边界和下边界。

3.实现辅助函数left(image [][]byte, col int) int,用于确定左边界。采用二分查找方法,在给定的列col中向左查找,直到找到第一个出现黑色像素的位置。

4.实现辅助函数right(image [][]byte, col int) int,用于确定右边界。采用二分查找方法,在给定的列col中向右查找,直到找到最后一个出现黑色像素的位置。

5.实现辅助函数up(image [][]byte, row int, left int, right int) int,用于确定上边界。采用二分查找方法,在给定的行row中从左边界到右边界之间查找,直到找到第一个出现黑色像素的位置。

6.实现辅助函数down(image [][]byte, row int, left int, right int) int,用于确定下边界。采用二分查找方法,在给定的行row中从左边界到右边界之间查找,直到找到最后一个出现黑色像素的位置。

7.在minArea函数中,调用辅助函数获取左边界、右边界、上边界和下边界,并计算矩形的面积((right - left + 1) * (down - up + 1))。

8.在main函数中,定义一个示例图片image和给定的点(x, y),调用minArea函数并将结果打印出来。

总的时间复杂度:由于每个辅助函数都采用了二分查找的方法,时间复杂度为O(logn),所以总的时间复杂度为O(logn)。

总的额外空间复杂度:除了存储输入数据和输出结果的额外空间外,代码没有使用其他额外的空间,因此总的额外空间复杂度为O(1)。

go完整代码如下:

package main

import "fmt"

func minArea(image [][]byte, x int, y int) int {
left := left(image, y)
right := right(image, y)
up := up(image, x, left, right)
down := down(image, x, left, right)
return (right - left + 1) * (down - up + 1)
} func left(image [][]byte, col int) int {
l, r, m, ans := 0, col-1, 0, col
find := false
for l <= r {
m = (l + r) / 2
find = false
for i := 0; i < len(image); i++ {
if image[i][m] == '1' {
find = true
break
}
}
if find {
ans = m
r = m - 1
} else {
l = m + 1
}
}
return ans
} func right(image [][]byte, col int) int {
l, r, m, ans := col+1, len(image[0])-1, 0, col
find := false
for l <= r {
m = (l + r) / 2
find = false
for i := 0; i < len(image); i++ {
if image[i][m] == '1' {
find = true
break
}
}
if find {
ans = m
l = m + 1
} else {
r = m - 1
}
}
return ans
} func up(image [][]byte, row int, left int, right int) int {
u, d, m, ans := 0, row-1, 0, row
find := false
for u <= d {
m = (u + d) / 2
find = false
for i := left; i <= right; i++ {
if image[m][i] == '1' {
find = true
break
}
}
if find {
ans = m
d = m - 1
} else {
u = m + 1
}
}
return ans
} func down(image [][]byte, row int, left int, right int) int {
u, d, m, ans := row+1, len(image)-1, 0, row
find := false
for u <= d {
m = (u + d) / 2
find = false
for i := left; i <= right; i++ {
if image[m][i] == '1' {
find = true
break
}
}
if find {
ans = m
u = m + 1
} else {
d = m - 1
}
}
return ans
} func main() {
image := [][]byte{{'0', '0', '1', '0'}, {'0', '1', '1', '0'}, {'0', '1', '0', '0'}}
x := 0
y := 2
result := minArea(image, x, y)
fmt.Println(result)
}

python代码如下:

# -*-coding:utf-8-*-

def minArea(image, x, y):
left = left_boundary(image, y)
right = right_boundary(image, y)
up = upper_boundary(image, x, left, right)
down = lower_boundary(image, x, left, right)
return (right - left + 1) * (down - up + 1) def left_boundary(image, col):
l, r, m, ans = 0, col-1, 0, col
find = False
while l <= r:
m = (l + r) // 2
find = False
for i in range(len(image)):
if image[i][m] == '1':
find = True
break
if find:
ans = m
r = m - 1
else:
l = m + 1
return ans def right_boundary(image, col):
l, r, m, ans = col+1, len(image[0])-1, 0, col
find = False
while l <= r:
m = (l + r) // 2
find = False
for i in range(len(image)):
if image[i][m] == '1':
find = True
break
if find:
ans = m
l = m + 1
else:
r = m - 1
return ans def upper_boundary(image, row, left, right):
u, d, m, ans = 0, row-1, 0, row
find = False
while u <= d:
m = (u + d) // 2
find = False
for i in range(left, right+1):
if image[m][i] == '1':
find = True
break
if find:
ans = m
d = m - 1
else:
u = m + 1
return ans def lower_boundary(image, row, left, right):
u, d, m, ans = row+1, len(image)-1, 0, row
find = False
while u <= d:
m = (u + d) // 2
find = False
for i in range(left, right+1):
if image[m][i] == '1':
find = True
break
if find:
ans = m
u = m + 1
else:
d = m - 1
return ans image = [['0', '0', '1', '0'], ['0', '1', '1', '0'], ['0', '1', '0', '0']]
x = 0
y = 2
result = minArea(image, x, y)
print(result)

2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系, “y下“和“y上“表示一条无限延伸的道路,“y下“表示这个道路的下限,“y上“表示这个道路的上限, 给定一批长方形,每一个长方形有(的更多相关文章

  1. Java 单文件、多文件上传 / 实现上传进度条

    博客地址:https://ainyi.com/76 日常,工作 在这里总结一下上传吧(是以前做过的练习,就汇总到个人博客吧) java ssm 框架实现文件上传 实现:单文件上传.多文件上传(单选和多 ...

  2. WInform中实现设置ZedGraph中曲线的X轴与Y轴的上限与下限

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  3. 解决iPhone上select时常失去焦点,随意跳到下一个输入框,影响用户操作

    window.addEventListener('load', function() { FastClick.attach(document.body); }, false); //300s延迟,解决 ...

  4. 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

  5. 梦想MxWeb3D协同设计平台 2019.02.28更新

    梦想MxWeb3D协同设计平台 2019.02.28更新 SDK开发包下载地址: http://www.mxdraw.com/ndetail_10130.html 在线演示网址: http://www ...

  6. 用阿里官网提供的plupload oss的web直传,视频上传进行前端验证它的时长,尺寸,大小等。替换上一个不需要的单个视频

    accessid = '' accesskey = '' host = '' policyBase64 = '' signature = '' callbackbody = '' filename = ...

  7. Winform中设置ZedGraph鼠标悬浮显示举例最近曲线上的点的坐标值和X轴与Y轴的标题

    场景 Winform中设置ZedGraph鼠标双击获取距离最近曲线上的点的坐标值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...

  8. Codeforces Round #450 (Div. 2) A. Find Extra One【模拟/判断是否能去掉一个点保证剩下的点在Y轴同侧】

    A. Find Extra One time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. echarts修改X,Y轴上的颜色

     分为2.0和3.0 一.2.0 修改的代码: x轴: xAxis : [ { type : 'category', data : ['<30','30-','40-','50-','60-', ...

  10. Highcharts属性与Y轴数据值刻度显示Y轴最小最大值

    Highcharts 官网:https://www.hcharts.cn/demo/highcharts Highcharts API文档:https://api.hcharts.cn/highcha ...

随机推荐

  1. [粘贴]环绕闸极不能让三星在3nm工艺领先台积电

    环绕闸极不能让三星在3nm工艺领先台积电 http://www.pinlue.com/article/2019/08/1510/599507978757.html 转身遇见她 2019-08-15 收 ...

  2. SQL注入payload学习整理

    SQLserver 用的payload 0101%'and 1=(select @@version) and '%'=' GS的一个客户端参数 <add PropertyName="F ...

  3. 数据仓库(4)基于维度建模的数仓KimBall架构

      基于维度建模的KimBall架构,将数据仓库划分为4个不同的部分.分别是操作型源系统.ETL系统.数据展现和商业智能应用,如下图.   操作型源系统,指的就是面向用户的各类系统,如app.网站.E ...

  4. Spring源码之XML文件中Bean标签的解析1

    读取XML文件,创建对象 xml文件里包含Bean的信息,为了避免多次IO,需要一次性读取xml文件中所有bean信息,加入到Spring工厂. 读取配置文件 new ClassPathResourc ...

  5. go中的sync.RWMutex源码解读

    读写锁 前言 什么是读写锁 看下实现 读锁 RLock RUnlock 写锁 Lock Unlock 问题要论 写操作是如何阻止写操作的 写操作是如何阻止读操作的 读操作是如何阻止写操作的 为什么写锁 ...

  6. 强化学习从基础到进阶-案例与实践[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验

    强化学习从基础到进阶-案例与实践[1]:强化学习概述.序列决策.动作空间定义.策略价值函数.探索与利用.Gym强化学习实验 1.1 强化学习概述 强化学习(reinforcement learning ...

  7. 找工作、备考、面试刷题网站推荐(牛客网、力扣、计蒜客、hihocoder、七月在线)以及acm竞赛oj

    不管是找工作笔试面试白板试进大厂,还是研究生参加初试复试,数据结构和算法都是都是重中之重,刷题就很必要,来拿走自己的offer 吧! 一.offer刷题推荐 1.牛客网 链接:牛客网 - 找工作神器| ...

  8. 4.8 C++ Boost 应用JSON解析库

    property_tree 是 Boost 库中的一个头文件库,用于处理和解析基于 XML.Json 或者 INFO 格式的数据. property_tree 可以提供一个轻量级的.灵活的.基于二叉数 ...

  9. 构建LVS负载均衡集群

    LVS即Linux虚拟服务器,目前 LVS 已经被集成到 Linux 内核模块中,该项目在 Linux 内核实现了基于 IP 的数据请求负载均衡调度方案,LVS集群采用IP负载均衡技术和基于内容请求分 ...

  10. Python实现希尔排序、快速排序、归并排序

    快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所 ...