跳转至

01.02数组基础部分

Python中的数组的增删改查部分

1. 查询访问元素

假设存在一个数组\(a\),且长度为\(n\),则数组中的元素可以通过下标进行访问,下标的范围为\([0,n-1]\),其中\(0\)表示数组的第一个元素,\(n-1\)表示数组的最后一个元素。数组的访问时间复杂度为\(O(1)\)

# 例如从数组a中取出下标为i的元素
def get(a,i):
    if i<0 or i>=len(a):#这里用n也可以,即i>=n,为了保证数组的下标不越界
        return -1#如果出现下标越界就提前返回-1
    return a[i]#如果下标未越界就正常输出
a=[0,1,2,3]
print(get(a,2))#输出2

2. 修改元素

例如将上述数组\(a\)中的下标为\(i\)的元素修改为\(x\),则可以通过下面的代码实现,修改元素的时间复杂度为\(O(1)\)

def change(a,i,x):
    if i<0 or i>=len(a):#同上,进行越界判断
        return -1
    a[i]=x
    return a
a=[0,1,2,3]
print(change(a,2,5))#输出[0,1,5,3]

3. 插入元素

假设在上述数组\(a\)中的下标为\(i\)的元素后面插入一个元素\(x\),则可以通过下面的代码实现,插入元素的时间复杂度为\(O(n)\)

def insert(a,i,x):
    if i<0 or i>=len(a):#同上,进行越界判断
        return -1
    a.insert(i,x)
    return a

4. 删除元素

假设在上述数组\(a\)中的下标为\(i\)的元素后面删除一个元素\(x\),则可以通过下面的代码实现,删除元素的时间复杂度为\(O(n)\)

def delete(a,i):
    if i<0 or i>=len(a):#同上,进行越界判断
        return -1
    a.pop(i)
    return a

01.02.02

练习题目 1

0066.加一 解题步骤:

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        n=len(digits)
        a=0
        for i in range(n):
            a*=10
            a=a+digits[i]
        a=str(int(a+1))
        res=[]
        for i in range(len(a)):
            res.append(int(a[i]))
        return res
解题思路: 1. 将数组中的数字提取出来,组成一个整数,然后+1 2. 将数字转化为数组即可

练习题目2

0724.寻找数组的中心下标

解题步骤:

class Solution:
    def pivotIndex(self, nums: List[int]) -> int:
        su=sum(nums)
        res=0
        for i in range(len(nums)):
            su-=nums[i]
            if res==su:
                return i
            res=res+nums[i]
        return -1

解题思路: 1. 首先计算数组的总和 2. 遍历数组,计算左侧右侧值的和进行比较即可

练习题目3:

0189.轮转数组 解题步骤:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        k %= len(nums)  
        nums[:] = nums[-k:] + nums[:-k]
解题思路: 这道题难点不在思路,在于如何使得Python可以修改nums数组引用的部分

01.02.03

练习题目1:

0048. 旋转图像 解题步骤:

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        n=len(matrix)
        for i in range(n):
            for j in range(i, n):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
        for i in range(n):
            matrix[i] = matrix[i][::-1]
解题思路: 该题的难点主要集中在先沿着主对角线,翻转,然后再左右翻转就可以得到反转之后的数组了

练习题目2:

0054. 螺旋矩阵 解题步骤:


解题思路:

01.02.04

练习题目1:

0066. 加一 解题步骤:

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        n=len(digits)
        a=0
        for i in range(n):
            a*=10
            a=a+digits[i]
        a=str(int(a+1))
        res=[]
        for i in range(len(a)):
            res.append(int(a[i]))
        return res
解题思路:

练习题目2:

0724. 寻找数组的中心下标 解题步骤:

class Solution:
    def pivotIndex(self, nums: List[int]) -> int:
        su=sum(nums)
        res=0
        for i in range(len(nums)):
            su-=nums[i]
            if res==su:
                return i
            res=res+nums[i]
        return -1
解题思路:

练习题目3:

0485. 最大连续 1 的个数 解题步骤:

class Solution:
    def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
        res=0
        t=0
        for i in range(len(nums)):
            if nums[i]==1 :
                res+=1
            else:
                t=max(res,t)
                res=0
        return max(res,t)
解题思路:

练习题目2:

解题步骤:


解题思路:

练习题目2:

解题步骤:


解题思路:

练习题目2:

解题步骤:


解题思路:

练习题目2:

解题步骤:


解题思路:

练习题目2:

解题步骤:


解题思路: