数据结构1 线性表 - 数组 - 保序操作

129 阅读1分钟

数组
基本特点:

  1. 是一段连续的存储空间 -> 插入慢,O(n)
  2. 支持随机访问 -> 查询快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]

实战
保序操作类型题目

解题思路: 利用过滤器思想,只在数组中保留符合条件的元素。

  1. 遍历数组 for : i
  2. 过滤条件 if
  3. 重组数组 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]