二进制求和、全排列、最大矩形(python实现)

二进制求和

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例 1:

输入:a = "11", b = "1"
输出:"100"

示例 2:

输入:a = "1010", b = "1011"
输出:"10101"

提示:

  • 1 <= a.length, b.length <= 104
  • a 和 b 仅由字符 '0' 或 '1' 组成
  • 字符串如果不是 "0" ,就不含前导零
import random
​
def two(a,b):
    a,b=int(a,2),int(b,2)
    c=str(bin(a+b))
    return c[2:]
​
if __name__=="__main__":
    a,b="0""0"
    for i in range(8):
        a+=str(random.randint(0,1))
        b+=str(random.randint(0,1))
        print(a,b,two(a,b))

全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:

输入:nums = [1]
输出:[[1]]
提示:

1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同

import random
​
def permute(nums):
    # 列表只有一个数字
    if len(nums) == 1:
        return [nums]
    
    #列表有几个数字
    permutations = []
    for i, num in enumerate(nums):#遍历列表每一个索引i和数字num
        for p in permute(nums[:i] + nums[i+1:]):#获取除了当前数字num之外的数字全排列,通过递归把几个数字排列转化为一个数字排列
            permutations.append([num] + p)#将当前数字 num 添加到子列表的每个全排列的前面,并将结果添加到 permutations 列表中
    return permutations
​
if __name__=="__main__":
    nums=[]
    for i in range(random.randint(0,10)):
        nums.append(i)
    print(nums)#输出原列表
    print(permute(nums))#输出全排列

最大矩形

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例 1:

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。

示例 2:

输入:matrix = []
输出:0

示例 3:

输入:matrix = [["0"]]
输出:0

示例 4:

输入:matrix = [["1"]]
输出:1

示例 5:

输入:matrix = [["0","0"]]
输出:0

提示:

  • rows == matrix.length
  • cols == matrix[0].length
  • 1 <= row, cols <= 200
  • matrix[i][j] 为 '0' 或 '1'
import random
​
def maxrectangle(matrix):#在矩阵中求最大矩形
​
    def largestRectangleArea(heights):#求直方图中的最大矩形面积
        stack = []#初始化空栈
        max_area = 0#初始面积为0
        heights.append(0)#在高度数组最后放置极小的元素,使原数组中的所有元素都被考虑
        for i in range(len(heights)):
            while stack and heights[i] < heights[stack[-1]]:#栈不为空且当前高度小于栈顶索引对应高度,得到右边界i
                h = heights[stack.pop()]#获取栈顶索引对应的高度
                w = i if not stack else i - stack[-1] - 1#计算宽度。如果栈为空,那么宽度就是 i;否则宽度是 i - stack[-1] - 1。( stack[-1] 是当前条目的左边界。)
                max_area = max(max_area, h * w)#更新最大面积
            stack.append(i)#栈用于存储索引
        return max_area
    
    m, n = len(matrix), len(matrix[0])#m是矩阵行数,n是矩阵列数
    heights = [0] * n #高度数组heights将用于存储每一列的连续1的高度
    max_area = 0
    for i in range(m):#遍历每行
        for j in range(n):#遍历每列
            if matrix[i][j]=='1':#如果第i行第j列是1,高度数组对应项加1
                heights[j]+=1
            else:#如果第i行第j列是0,高度数组重置为0
                heights[j]=0
        max_area = max(max_area, largestRectangleArea(heights))#更新最大面积
    
    return max_area
​
if __name__=='__main__':
    nums=[]
    num_matrix=[]
    x,y=random.randint(0,10),random.randint(0,5)
    for i in range(y):
        for k in range(x):
            nums.append(str(random.randint(0,1)))
        num_matrix.append(nums)
        nums=[]
    print(num_matrix)
    print(maxrectangle(num_matrix))

求直方图中最大矩形的方法:

https://www.cnblogs.com/GarrettWale/p/15796780.html

求矩阵中最大矩形的方法:

https://www.cnblogs.com/GarrettWale/p/15800968.html

为什么在矩阵中求最大矩形可以引用直方图求最大矩形的方法?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值