力扣刷题

本文介绍了力扣(LeetCode)中的一些经典算法题目,包括861. 翻转矩阵后的得分,两数之和,无重复字符的最长子串,寻找两个正序数组的中位数,整数反转等。通过详细讲解思路和提供源代码,帮助读者理解和解决这些问题。
摘要由CSDN通过智能技术生成

861. 翻转矩阵后的得分

“”"
有一个二维矩阵 A 其中每个元素的值为 0 或 1 。

移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。

在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数字的总和。

返回尽可能高的分数。

示例:

输入:[[0,0,1,1],[1,0,1,0],[1,1,0,0]]
输出:39
解释:
转换为 [[1,1,1,1],[1,0,0,1],[1,1,1,1]]
0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39

提示:

1 <= A.length <= 20
1 <= A[0].length <= 20
A[i][j] 是 0 或 1
思路:
可以这样看,n*m的每个格子都具有一个权重,其中每一行权重都自左向右递减,
为使总和最大则尽可能使权重大的格子填“1”。最左边一列权重最大,所以总可以通过
行翻转使左边第一列全都置“1”,后面就不能再使用行翻转了,以免破环当前的结构,
所以考虑列翻转。对于除最左边第一列外的每一列,总可以通过列翻转使得该列“1”
的个数不小于“0”的个数。最后所有填“1”的格子的权重和即为答案。

“”"
源码

def matrix(A) -> int:
    m, n = len(A), len(A[0])
    for i in range(m):
        if A[i][0] == 0:
            for j in range(n):
                A[i][j] = 1 ^ A[i][j]
    mySum = 0
    #zip(*A)对数组A里的数组进行操作
    for i in zip(*A):
        n -= 1
        mySum += 2** n * max(i.count(1),i.count(0))
    return mySum

1. 两数之和

“”"
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

“”"
代码

def twoSum(Sums, target):
    hashmap = {
   }
    for index, num in enumerate(Sums):
        other_num = target - num
        if other_num in hashmap:
            return [hashmap[other_num], index]
        hashmap[num] = index
    
nums = [2, <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值