zltzlt 发表于 2020-1-3 21:09:57

Python:每日一题 299

今天的题目:

在一个 01 矩阵中找到全为 1 的最大正方形,返回它的面积。

示例 1:

输入:
[
,
,
,

]
输出:4
示例 2:

输入:
[
,

]
输出:1

{:10_298:}欢迎大家一起答题!{:10_298:}

阴阳神万物主 发表于 2020-1-3 21:18:22

本帖最后由 阴阳神万物主 于 2020-1-4 01:32 编辑

这题,仿佛做过……
但是一下子找不到原题,于是新写一个:
def solve(photo):
    maxa = 0#最大的边长
    h,w = len(photo),(len(photo) if photo else 0)
    for x in range(h):
      for y in range(w):
            a = 0#边长
            flg = photo
            while flg:
                a += 1
                try:
                  for i in range(x,x+a+1):
                        if not photo:
                            flg = False
                            break
                  else:
                        for j in range(y+a-1,y-1,-1):
                            if not photo:
                              flg = False
                              break
                except IndexError:
                  break
            if a == h or a == w:
                return a*a
            maxa = max(a,maxa)
    return maxa*maxa
if __name__ == '__main__':
    print('示例1 输出:',solve([
,
,
,

]))
    print('示例2 输出:',solve([
,

]))
我用了 try 不算违规吧?

kinkon 发表于 2020-1-3 21:19:32

水平没达到,但还是很热衷看每日一贴,占位看楼下的了

zltzlt 发表于 2020-1-3 21:33:02

阴阳神万物主 发表于 2020-1-3 21:18
这题,仿佛做过……

嗯,再做一次{:5_109:}

Croper 发表于 2020-1-3 21:37:21

本帖最后由 Croper 于 2020-1-3 22:17 编辑

先写一个,感觉时间复杂度能压倒O,一会想法再优化下。def func299(grid):
    if len(grid)==0 or len(grid)==0:
      return 0
    ret=0
    for i in range(len(grid)):
      for j in range(len(grid)):
            if grid==0:
                continue
            
            if i>0 and j>0:
                grid=grid+1

            for k in range(1,grid):
                if (grid==0 or grid==0):
                  grid=k
                  break

            ret=max(ret,grid)

    return ret**2

塔利班 发表于 2020-1-3 21:39:53

def f299(M):
    I,J=len(M),len(M)
    D=min(I,J)
    if D:
      for d in range(D,0,-1):
            for i in range(I-d+1):
                for j in range(J-d+1):
                  if M:
                        if for e in M]==[*d for _ in range(d)]:
                            return d**2
    return 0先写个

Croper 发表于 2020-1-3 21:50:35

改良版,这下应该是O了def func299(grid):
    if len(grid)==0 or len(grid)==0:
      return 0
    ret=0
    for i in range(len(grid)):
      for j in range(len(grid)):
            if grid==0:
                continue
            
            if i>0 and j>0:
                grid=1+min(grid,grid,grid)

            ret=max(ret,grid)

    return ret**2

fan1993423 发表于 2020-1-4 11:37:11

本帖最后由 fan1993423 于 2020-1-4 16:42 编辑

from itertools import product
def fun299(lst):
    if not len(lst) or not len(lst):
      return 0
    result=[]
    coordinate=[]
    width,height=len(lst),len(lst)
    for i in range(height):
      for j in range(width):
            if lst:
                d=min(height-i,width-j)
                for h in range(1,d+1):
                  k=list(range(h))
                  for m,n in product(k,repeat=2):
                        coordinate.append(lst)
                  if 0 not in coordinate:
                        result.append(h)
                  coordinate=[]
    return max(result)**2 if len(result) else 0
效率我先不考虑哈,我觉得先解出来再说,楼主可以测一下时间,当然不知道对不对。
不知道允不允许空列表,还是把空列表的弄成0吧。

zltzlt 发表于 2020-1-4 16:11:57

阴阳神万物主 发表于 2020-1-3 21:18
这题,仿佛做过……
但是一下子找不到原题,于是新写一个:
我用了 try 不算违规吧?

当然不算犯规{:10_256:}

zltzlt 发表于 2020-1-4 16:17:19

阴阳神万物主 发表于 2020-1-3 21:18
这题,仿佛做过……
但是一下子找不到原题,于是新写一个:
我用了 try 不算违规吧?

输入大矩阵超时。

zltzlt 发表于 2020-1-4 16:41:32

塔利班 发表于 2020-1-3 21:39
先写个

输入大矩阵超时

fan1993423 发表于 2020-1-4 16:44:12

不用说,我这个肯定超时了

zltzlt 发表于 2020-1-4 16:44:25

fan1993423 发表于 2020-1-4 11:37
效率我先不考虑哈,我觉得先解出来再说,楼主可以测一下时间,当然不知道对不对。
不知道允不允许空列表 ...

输入 [,,,,,,,,,] 报错:ValueError: max() arg is an empty sequence

fan1993423 发表于 2020-1-4 16:46:17

zltzlt 发表于 2020-1-4 16:44
输入 [,,,,,,,

你确定,我这边输出0

zltzlt 发表于 2020-1-4 16:49:14

fan1993423 发表于 2020-1-4 16:46
你确定,我这边输出0

嗯,改后的代码可以了,输入大矩阵超时

fan1993423 发表于 2020-1-4 16:51:02

zltzlt 发表于 2020-1-4 16:49
嗯,改后的代码可以了,输入大矩阵超时

嗯,可能我的复杂度比他们都高,毕竟都用上product。还是来看一下大神的解法

fan1993423 发表于 2020-1-4 17:02:30

zltzlt 发表于 2020-1-4 16:49
嗯,改后的代码可以了,输入大矩阵超时

这么辛苦,就不加荣誉,不加鱼币啊{:10_256:}

fan1993423 发表于 2020-1-4 17:03:05

Croper 发表于 2020-1-3 21:50
改良版,这下应该是O了

思路好巧,佩服

TJBEST 发表于 2020-1-4 17:09:25

版主,我又来了,这次我又来了一个超长代码,请您笑纳。{:5_109:}
def fun299(martrix):
    def isBiger(martrix,index_x,index_y,maxlenth):#给定点寻找以其为正方形左上顶点的最大边长
      if maxlenth != 0:
            for i in range(0,maxlenth):
                totalSum = sum(martrix)
                if totalSum < maxlenth:
                  return None
      index = 0
      while True:
            if (index_x + maxlenth - 1 + (index + 1))> (m-1) or(index_y + maxlenth - 1 + (index + 1))> (n-1):
                if index > 0:
                  return maxlenth + index
                else:
                  return None
            else:
                sum_x = sum(martrix)
                if sum_x < (maxlenth + index + 1):
                  if index > 0:
                        return maxlenth + index
                  else:
                        return None
                else:
                  for i in range(0,maxlenth + index + 1):
                        if martrix == 0:
                            if index > 0:
                              return maxlenth + index
                            else:
                              return None
            index = index + 1

                        
   
    m = len(martrix)#行数
    n = len(martrix)#列数
      
    maxlenth = 0#最大边长
    index_x = 0#行号
    index_y = 0#列号

    rightgate = n - 1#右边界
    bottomgate = m - 1#下边界
   
    while rightgate >= 0 and index_x <= bottomgate:
      if martrix == 0:
            pass
      else:
            temp = isBiger(martrix,index_x,index_y,maxlenth)
            if temp == None:
                pass
            else:
                maxlenth = temp
                rightgate = n - 1 - maxlenth
                bottomgate = m - 1 - maxlenth
      index_y = index_y + 1
      if index_y <= rightgate:
            pass
      else:
            index_y = 0
            index_x = index_x + 1
    return maxlenth*maxlenth

Stubborn 发表于 2020-1-4 19:54:08

之前在做过一个找矩形的题目,本质上,从矩形变成正方形,也没差,所以不再额外改代码了

from typing import List
import math

def maximalRectangle(square: List]) -> int:
    if not square or not square:
      return 0
    nums =
    ans, N = 0, len(nums)
    for i in range(N):
      j, num = i, nums
      while j < N:
            num = num & nums
            if not num:
                break
            l, curnum = 0, num
            while curnum:
                l += 1
                curnum = curnum & (curnum << 1)
            ans = max(ans, l * (j-i+1))
            j += 1
    return int(math.sqrt(ans))
页: [1] 2
查看完整版本: Python:每日一题 299