数组在什么情况下使用?

举报
Xxy_1008 发表于 2024/08/25 15:05:34 2024/08/25
【摘要】 首先什么是数组?如何引入数组?在Python中,数组(Array)通常指的是列表(List),不过在某些情况下,我们也使用NumPy库中的数组来处理多维数组和矩阵。在这里,我将详细介绍Python中的列表和NumPy数组。一、Python中的列表Python的列表是一种内置的数据结构,它是一个有序的可变集合,可以包含任意类型的元素。1. 创建列表# 创建一个空列表my_list = []# ...

首先什么是数组?如何引入数组?

在Python中,数组(Array)通常指的是列表(List),不过在某些情况下,我们也使用NumPy库中的数组来处理多维数组和矩阵。在这里,我将详细介绍Python中的列表和NumPy数组。

一、Python中的列表

Python的列表是一种内置的数据结构,它是一个有序的可变集合,可以包含任意类型的元素。

1. 创建列表



# 创建一个空列表
my_list = []

# 创建一个包含元素的列表
my_list = [1, 2, 3, "apple", "banana"]

2. 访问列表元素

# 访问列表中的元素
first_element = my_list[0]  # 访问第一个元素
last_element = my_list[-1]  # 访问最后一个元素

3. 修改列表

# 修改列表中的元素
my_list[0] = 10  # 修改第一个元素的值

4. 列表方法




# 添加元素
my_list.append("orange")  # 在列表末尾添加元素
my_list.insert(1, "grape")  # 在指定位置插入元素

# 删除元素
my_list.remove("banana")  # 删除指定元素
popped_element = my_list.pop()  # 删除并返回最后一个元素
popped_element = my_list.pop(1)  # 删除并返回指定位置的元素

# 其他常用方法
length = len(my_list)  # 获取列表长度
index = my_list.index("apple")  # 获取元素的索引
my_list.sort()  # 对列表进行排序

二、NumPy数组

NumPy是一个用于科学计算的库,它提供了对数组和矩阵的支持。NumPy数组与Python列表相比具有更高的性能,特别是在处理大规模数据时。

1. 安装NumPy

在使用NumPy之前,需要先安装它:

pip install numpy

2. 创建NumPy数组


import numpy as np

# 创建一维数组
array_1d = np.array([1, 2, 3, 4])

# 创建二维数组
array_2d = np.array([[1, 2, 3], [4, 5, 6]])

# 创建全零数组
zeros = np.zeros((3, 3))

# 创建全一数组
ones = np.ones((3, 3))

# 创建单位矩阵
eye = np.eye(3)

# 创建等差数组
arange = np.arange(0, 10, 2)  # [0 2 4 6 8]

# 创建随机数组
random_array = np.random.random((2, 2))

3. 访问和修改NumPy数组


# 访问数组元素
element = array_1d[0]  # 访问一维数组中的元素
element = array_2d[0, 1]  # 访问二维数组中的元素

# 修改数组元素
array_1d[0] = 10  # 修改一维数组中的元素
array_2d[0, 1] = 20  # 修改二维数组中的元素

4. NumPy数组操作




# 数组形状
shape = array_2d.shape  # 获取数组形状

# 数组重塑
reshaped_array = array_1d.reshape((2, 2))

# 数组切片
sliced_array = array_1d[1:3]  # 一维数组切片
sliced_array_2d = array_2d[:, 1]  # 二维数组切片

# 数组运算
sum_array = array_1d + 5  # 数组每个元素加5
product_array = array_1d * 2  # 数组每个元素乘2

TO A SUM:

Python中的数组主要有两种:内置的列表和NumPy提供的数组。列表适用于一般用途的数据存储和操作,而NumPy数组在处理大规模数据和科学计算时具有更高的性能。了解这两种数据结构及其操作方法,可以更高效地处理各种数据任务。

接下来这道算法题,就印证了数组的重要性。看题:

戳气球[困难]

题目:

有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。

求所能获得硬币的最大数量。


示例 1:

输入:nums = [3,1,5,8]
输出:167
解释:
nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins =  3*1*5    +   3*5*8   +  1*3*8  + 1*8*1 = 167

示例 2:

输入:nums = [1,5]
输出:10

提示:

  • n == nums.length
  • 1 <= n <= 300
  • 0 <= nums[i] <= 100

 题目分析:

        这道题需要用到数组和动态规划来解,数组用来储存遍历到的金币值,动态规划遍历最后一个被戳破的气球的下标,然后将其分为左右和自身两部分,计算出金币值与当前最大的金币值做比较。遍历完即可。

代码实现:

class Solution:
    def maxCoins(self, nums: List[int]) -> int:
        #nums首尾添加1,方便处理边界情况
        nums=[1]+nums+[1]
        dp = [[0]*(len(nums)) for i in range(len(nums))]
        def calc(i,j):
            m = 0 
            #k是(i,j)区间内最后一个被戳的气球
            for k in range(i+1,j): #k取值在(i,j)开区间中
                #以下都是开区间(i,k), (k,j)
                l = dp[i][k]
                r = dp[k][j]
                key = l+r+ nums[i]*nums[k]*nums[j]
                if key > m: m = key
            dp[i][j] = m  # 存储到dp中

        #对每一个区间长度进行循环
        for n in range(2,len(nums)): #区间长度的初始位置
            #开区间长度会从3一直到len(nums)
            #对于每一个区间长度,循环区间开头的i
            for i in range(0,len(nums)-n): #i+n = len(nums)-1
                calc(i,i+n)
        return dp[0][len(nums)-1]

总结: 

        这道题考到了动态规划,但是动态规划是我的弱项,对于解出这道题来说还是远远不够的,所以又看了题解才磨出来了这道题。这个动态规划的解决方案的关键在于,我们通过递归地计算每个子问题的最优解,来构建整个问题的最优解。每次我们选择一个气球作为最后一个被戳破的气球,并将其乘积加到最优解上,然后递归地计算左右两边的子区间。通过这种方法,我们能够得到全局的最优解。

        我们定义了一个二维数组 dp,其中 dp[i][j] 表示在戳破气球 i 和 j 之间的所有气球(包括 i 和 j)后我们能得到的最大分数。注意这里的 i 和 j 指的是气球的下标,dp 数组的大小为 len(nums) x len(nums)

  calc 函数的作用是计算从 i 到 j 的区间内的最大分数,并将其存储在 dp[i][j] 中。函数内部通过遍历 (i+1, j) 区间内的所有可能的 k,来找到最后一个被戳破的气球 k。对于每个 k,我们计算 dp[i][k] 和 dp[k][j] 的和,再加上气球 ik 和 j 的分数乘积,然后更新 dp[i][j] 的最大值。

       最后,我们通过循环不同长度的区间来填充 dp 数组。对于每个区间长度 n,我们从区间开头 i 开始,计算区间 (i, i+n) 的最大分数。通过这种方式,我们最终得到了 dp[0][len(nums)-1] 的值,这是我们戳破所有气球后能得到的最大分数。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。