数组:
在连续的内存空间中,存储一组相同类型的元素
区分
- 元素
- 索引 — (从0开始)
– - 数组访问(Access) — 通过索引取得某个元素的值a[1]
- 数组搜索(Search) — 遍历数组搜索某个元素且可返回索引
时间复杂度
- 访问Access — O(1)
- 搜索Search — O(N)
- 插入Insert — O(N)
- 删除Delete — O(N)
特点
- 适合读
- 不适合写
- 读多写少
常用操作
-
创建数组
a = []
– -
添加元素
a.append()
(添加的元素)
数组后还有空间O(1);无空间O(N)
–
a.insert(2, 99)
(插入的索引,插入的元素)
O(N)
– -
访问元素
temp = a[2]
– -
修改元素
a[2] = 88
– -
删除元素
a.remove(88)
(删除的元素)
O(N)
–
a.pop(1)
(删除的索引)
O(N)
–
a.pop()
删除最后一个元素
O(1)
– -
遍历数组
for i in a:
i为元素
–
for index, element in enumerate(a):
–
for i in range(0, len(a)):
i为索引
– -
查找元素
index = a.index(2)
(查找的元素)
返回索引
O(N)
– -
数组的长度
size = len(a)
– -
数组排序(内置的排序方法)
a.sort()
从小到大
a.sort(reverse=True)
从大到小
O(NlogN)
练习题
- 485 . 最大连续1的个数
class Solution:
# One pass
# N is the size of nums
# Time Complexity: O(N)
# Space Complexity: O(1)
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
if nums is None or len(nums) == 0:
return 0
count = 0
result = 0
for num in nums:
if num == 1:
count += 1
else:
result = max(result, count)
count = 0
return max(result, count)
- 283 . 移动0
class Solution:
# One pass
# N is the size of nums
# Time Complexity: O(N)
# Space Complexity: O(1)
def moveZeros(self, nums: List[int]) -> None:
index = 0
for num in nums:
if num != 0:
nums[index] = num
index += 1
for i in range(index, len(nums)):
nums[i] = 0
- 27 . 移除元素 — 双指针解法
class Solution:
# Two pointers
# N is the size of nums
# Time complexity: O(N)
# Space complexity: O(1)
def removeElement(self, nums: List[int], val: int)
if nums is None or len(nums) == 0:
return 0
l, r = 0, len(nums) -1
while l < r:
while (l < r and nums[l] != val):
l += 1
while (l < r and nums[r] != val):
r -= 1
nums[l], nums[r] = nums[r], nums[l]
return l if nums[l] == val else l+1
学习视频来源B站—爱学习的饲养员—手把手带你刷Leetcode力扣