子数组相关操作python

一 .最大子数组和

题目链接:53. 最大子数组和 - 力扣(LeetCode)

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

法1:动态规划

遍历列表,我们让列表每个位置存放的 “包含这个位置的子数组中最大的和” 

包含这个位置元素的子数组 有两种可能:

1.它本身单独一个数        :【它本身】

2.它和前面的数组成子数组  :    【包含前一个位置 的子数组的最优情况 】+ 【它本身】

如 【1 ,-1 , 1】遍历后变成【1,0,1】

我们再初始化一个 最大值 max_sum实时与最新情况比较,记录出现的情况中的最大值

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        # 动态规划方法
        n = len(nums)
        if n == 1:return nums[0]
        max_sum = nums[0]
        for i in range(1,n):
            nums[i] = max(nums[i] + nums[i-1],nums[i])
            if nums[i] > max_sum:max_sum = nums[i]
        return max_sum

二.子数组的最大绝对值

题目链接:1749. 任意子数组和的绝对值的最大值 - 力扣(LeetCode) 

给你一个整数数组 nums 。一个子数组 [numsl, numsl+1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl + numsl+1 + ... + numsr-1 + numsr) 。

请你找出 nums 中 和的绝对值 最大的任意子数组(可能为空),并返回该 最大值 。

abs(x) 定义如下:

  • 如果 x 是负整数,那么 abs(x) = -x 。
  • 如果 x 是非负整数,那么 abs(x) = x 。

雷区:下面的做法是错的

# 错误做法
class Solution:
    def maxAbsoluteSum(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 1: return abs(nums[0])
        max_abs = abs(nums[0])
        nums[0] = abs(nums[0])
        for i in range(1,n):
            nums[i] = max(abs(nums[i] + nums[i-1]),abs(nums[i]))
            max_abs = max(max_abs,nums[i])
        return max_abs
            

一开始写太快我就写成这样,但是这种写法纯在巨大的逻辑错误。绝对值与 求 最大/最小值 不同

最大最小值中 :  -9 < 0 < 1  纯粹的相加结果是一个方向一直推进的

绝对值: 变成了 0 < 1< | -9 |  ,单纯的相加结果的-9 ,摇身一遍成了最大值。

所以 我们不能再一次遍历中直接去比较。因为单纯的相加结果比较 跟 最大值比较 的结果不一定相同

所以 我们分别求出 最大值和最小值,最后返回绝对值大者即可

正确写法:


class Solution:
    def maxAbsoluteSum(self, nums: List[int]) -> int:
        # 动态规划方法,求出最大值和最小值,返回两者中绝对值较大者
        n = len(nums)
        if n == 1:return abs(nums[0])
        nums_min = nums[:]
        # 原来的列表中的值在求极值之一时就改变了,求解剩下的极值不能再用原列表
        # 所以在开始之前先复制列表
        max_sum = nums[0]
        min_sum = nums[0]
        for i in range(1,n):
            nums[i] = max(nums[i] + nums[i-1],nums[i])
            if nums[i] > max_sum:max_sum = nums[i]
        for i in range(1,n):
            nums_min[i] = min(nums_min[i]+nums_min[i-1],nums_min[i])
            if nums_min[i] < min_sum : min_sum = nums_min[i]
        return max(abs(max_sum),abs(min_sum))
            
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
NumPy是Python中用于科学计算的一个重要库,它提供了高性能的多维数组对象和各种数学函数,是许多数据分析和科学计算任务的基础。在NumPy中,二维数组是最常用的数据结构之一,可以进行各种基本操作。 以下是NumPy二维数组的基本操作: 1. 创建二维数组: - 使用`numpy.array()`函数创建二维数组。 - 使用`numpy.zeros()`或`numpy.ones()`函数创建全零或全一的二维数组。 - 使用`numpy.random.rand()`或`numpy.random.randn()`函数创建随机值的二维数组。 2. 访问元素: - 使用索引访问二维数组中的元素,索引从0开始。 - 可以使用切片操作获取二维数组数组。 3. 数组形状: - 使用`numpy.shape`属性获取二维数组的形状,返回一个元组表示行数和列数。 - 使用`numpy.reshape()`函数改变二维数组的形状。 4. 数组操作: - 使用`numpy.transpose()`函数进行转置操作,交换行和列。 - 使用`numpy.concatenate()`函数进行数组的拼接操作。 - 使用`numpy.split()`函数进行数组的分割操作。 5. 数组运算: - 支持基本的数学运算,如加法、减法、乘法和除法。 - 可以使用`numpy.dot()`函数进行矩阵乘法运算。 - 可以使用`numpy.sum()`、`numpy.mean()`等函数计算数组的和、平均值等。 6. 数组迭代: - 可以使用`for`循环迭代二维数组的每个元素。 - 可以使用`numpy.nditer()`函数进行更灵活的迭代操作
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值