算法刷题2-数组章节

本文介绍了如何运用快慢指针和区域划分策略解决编程问题,包括将0移动到数组末尾、颜色分类、删除有序数组重复项和合并两个有序数组,强调了原地操作和空间复杂度优化。
摘要由CSDN通过智能技术生成

2 数组

2.0 数组题目总结

  1. 快慢指针
    • 一个遍历,一个指向更新位置
  2. 覆盖操作
    • 如果可以不用在乎某些值,可以直接覆盖,而不是交换。
  3. 区域指针
    • 对问题进行区域划分,使用不同指针指向区域的更新位置。

2.1 移动0(LC-283

  1. 问题描述:给定一个数目nums,编写一个函数将所有0移动到数组末尾,同时保持非0元素的相对位置。(原地操作)
  2. 解题思路:双指针,快慢指针
    • 快指针遍历数组,慢指针指向更新位置。(覆盖操作)
    • 初始化时,快慢指针都指向0位置。
    • 快指针遍历数组,当快指针指向的数不为0时,和慢指针互换,并让快指针指向下一个位置。
      • 如果不含0,那么快慢指针同时会超过数组长度。
      • 如果有0,那么让慢指针指向的位置及以后都赋值为0。
  3. 时间复杂度O(n),空间复杂度O(1)

2.2 颜色分类(LC-75

  1. 问题描述:原地操作数组元素的三种颜色(红、白、蓝),使得数组中相同颜色的相邻,而且保证红、白、蓝的顺序。
  2. 解题思路:三指针:三个区域的划分使用:两个区域指针(left和right)+遍历指针(index)
    • 移动index指针遍历,left初始指向最左边(它左边都是红色),right初始指向最右边(它右边都是蓝色)
    • index遍历值:为红色则和left所指交换,为蓝色则和right所指进行交换,非两边则不动。
  3. 时间复杂度O(n),空间复杂度O(1)

2.3 删除有序数组中的重复项(LC-26

  1. 问题描述:对升序的数组原地删除重复的元素,使得每个元素只出现一次,放回删除后数组的新长度,元素的相对顺序保持一致。
  2. 解题思路:双指针,快慢指针(覆盖操作)
    • 快指针遍历数组,慢指针指向更新位置。
  3. 时间复杂度O(n),空间复杂度O(1)

2.4 合并两个有序数组(LC-88

  1. 问题描述:对两个有序数组nums1和nums2进行合并,合并在nums1成为一个有序数组。假设nums1为m+n(初始有效元素为m个),nums2为n。
  2. 解题思路:三指针,一个遍历指针,两个位置指针。
    • 遍历指针j从尾部(最大值)遍历nums2。
    • 位置指针i指向nums1的有效最大尾部。位置指向cur指向nums最末端的空位置。
    • 每次遍历的时候比较指针i和指针j的值:(直到j遍历完nums2)
      • j大则放在cur上,并往前移动cur和j。
      • i大,则移动i的值到cur,并同时往前移动i和cur。
      • 相等的话可以随便写在上述任意一种情况。
  3. 时间复杂度O(m+n),空间复杂度O(m+n)
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值