数组
基本特点:
- 是一段连续的存储空间 -> 插入慢,O(n)
- 支持随机访问 -> 查询快O(1)
数组的关键:
索引与索址(头部地址加偏移量)
时间复杂度
Lookup O(1)
Insert O(n)
Delete O(n)
Append O(1)
Prepend O(n)
空间复杂度
O(n)
Code eg:
Java: int[] arr = new int[]{};
Python: arr = []\
索引 arr[i]
实战
保序操作类型题目
解题思路: 利用过滤器思想,只在数组中保留符合条件的元素。
- 遍历数组 for : i
- 过滤条件 if
- 重组数组 a[n] = a[i]
Tips: 注意边界
1.删除有序数组中的重复数字
26. 删除有序数组中的重复项 - 力扣(LeetCode) (leetcode-cn.com)
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
n = 0
for i in range(0, len(nums)):
if i == 0 or nums[i] != nums[i - 1]: #只保留不重复的
nums[n] = nums[i]
n += 1
return n
2.移动零
283. 移动零 - 力扣(LeetCode)
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = 0
for i in range(0, len(nums)):
if nums[i] != 0: #只保留非0的,后面补0
nums[n] = nums[i]
n += 1
while n < len(nums):
nums[n] = 0
n += 1
3.合并两个有序数组
88. 合并两个有序数组 - 力扣(LeetCode)
不占用额外空间
两个数组比较,因为可能存在j越界的情况,会覆盖掉i的值,所以倒序处理,去重类题目,n一定是小于等于i的所以可以正向遍历。
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
i, j = m - 1, n - 1
for k in range(m + n - 1, -1, -1):
#j出界时,或者i, j都没出界 取大的
if(j < 0 or (i >= 0 and nums1[i] >= nums2[j])):
nums1[k] = nums1[i]
i -= 1
else:
nums1[k] = nums2[j]
j -= 1
占用额外空间
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
res = []
i = j = 0
while i < m or j < n:
#j出界时,或者i, j都没出界 取小的
if(j >= n or (i < m and nums1[i] <= nums2[j])):
res.append(nums1[i])
i += 1
else:
res.append(nums2[j])
j += 1
for i in range(0, m + n):
nums1[i] = res[i]