数组是算法的起点,掌握数组操作是通关面试的第一步
数组(Array)是最基础的数据结构,在内存中连续存储相同类型的元素。数组的随机访问时间复杂度为 O(1),插入/删除需要移动元素,时间复杂度为 O(n)。面试中,数组问题常常结合双指针、哈希表、前缀和等技巧来优化。
# 初始化
arr = [1, 2, 3, 4, 5]
arr = [0] * 10 # 固定大小
# 访问与修改
x = arr[0] # O(1) 访问
arr[0] = 10 # O(1) 修改
# 添加与删除
arr.append(6) # O(1) 均摊
arr.pop() # O(1) 删除末尾
arr.insert(0, 0) # O(n) 头部插入
arr.pop(0) # O(n) 头部删除
# 切片
sub = arr[1:4] # [arr[1], arr[2], arr[3]]
rev = arr[::-1] # 反转
# 排序与查找
arr.sort() # 原地排序 O(n log n)
idx = arr.index(3) # 查找 O(n)
list 底层是动态数组,自动扩容。平均 append 是 O(1),但扩容时单次 O(n)。面试中如果需要严格 O(1) 的头部操作,考虑 collections.deque。题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值的两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,且同一个元素不能使用两遍。
num,检查 target - num 是否已经在哈希表中。class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hash_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hash_map:
return [hash_map[complement], i]
hash_map[num] = i
return []
时间复杂度:O(n) — 只需一次遍历,哈希表查找 O(1)
空间复杂度:O(n) — 最坏情况存入 n-1 个元素
题目描述:给你一个整数数组 nums。如果任一值在数组中出现至少两次,返回 true;如果数组中每个元素互不相同,返回 false。
return len(set(nums)) != len(nums)class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
seen = set()
for num in nums:
if num in seen:
return True
seen.add(num)
return False
时间复杂度:O(n) — 单次遍历 + O(1) 集合操作
空间复杂度:O(n) — 最坏存入 n 个元素
题目描述:给你一个整数数组 nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
nums[i] 本身,要么是 dp[i-1] + nums[i]。dp[i] = max(nums[i], dp[i-1] + nums[i])class Solution:
def maxSubArray(self, nums: List[int]) -> int:
cur_sum = best_sum = nums[0]
for num in nums[1:]:
cur_sum = max(num, cur_sum + num)
best_sum = max(best_sum, cur_sum)
return best_sum
时间复杂度:O(n) — 一次遍历
空间复杂度:O(1) — 只用两个变量
数组看似简单,但面试中的数组题往往暗藏玄机。这里补充几个重要的数组高级技巧,为后续课程做铺垫。
当数组元素范围在 [1, n] 时,可以把数组本身当作哈希表使用。通过将元素值映射到索引(nums[i] → 索引 nums[i]-1),实现 O(1) 空间的检测。
# 原地哈希: 找到所有出现两次的数
# nums[i] 应该在 nums[nums[i]-1] 的位置
def findDuplicates(nums):
result = []
for num in nums:
idx = abs(num) - 1
if nums[idx] < 0:
result.append(abs(num))
else:
nums[idx] = -nums[idx]
return result
在 O(1) 空间内找多数元素(出现次数 > n/2 的元素)。核心思想:不同元素两两抵消,最后剩下的就是多数元素。
def majorityElement(nums):
count = 0
candidate = None
for num in nums:
if count == 0:
candidate = num
count += 1 if num == candidate else -1
return candidate