基于数组的几类算法题总结

数组的物理结构

所有对数组的操作,都要从了解数组的结构开始。

  1. 数组在内存空间中的地址是连续的,其中每个数据占据的空间是相同的。
  2. 数组下标都是从0开始。(大多数对数组的操作都是基于下标)

因为数组在内存空间的地址是连续的,所以在增添和删除元素时,就难免要移动其他元素。

注意:数组元素的删除操作,本质上不是删除,而是覆盖。

题型总结

这里对题目的详细流程不做赘述,只回顾一遍不同题型中的重难点。

二分法

题型详解:leetcode704、二分搜索
重难点:

  1. 区间定义:不同的区间定义下,边界条件也会不同——循环的终止条件、左右指针的移动。
  2. 中间位置的计算:在C++中,为了防止两数之和太大导致大数越界的问题,应该采用公式:(right-left)/2+left来计算mid
  3. 区间移动:数组存在目标值的情况下。
    当nums[mid] < target时,表明目标值在[mid+1,right]区间;
    当nums[mid] > target时,表明目标值在[left,mid-1]区间

双指针法

题型详解:leetcode27、移除元素
重难点:

  1. 移除操作:数组中的元素不能删除,对元素的移除操作,本质上是覆盖。
  2. 指针用途:定义一个快指针,用来搜索符合要求的元素;
    定义一个慢指针,用来把快指针搜索到符合要求的元素覆盖到原数组中。

滑动窗口

题型详解:leetcode209、长度最小的子数组
重难点

  1. 确定窗口起始位置和终止位置的移动
    起始位置:在子数组的总和满足条件,起始位置向右移动,直到不满足条件时。
    终止位置:在不满足条件时,终止位置向右移动,直到满足条件。
  2. 初始位置移动和子数组总和变化应匹配:在初始位置移动后,当前子数组的总和也应变化。

模拟

题型详解:leetcode59、螺旋矩阵II
重难点

  1. 明确每一圈循环赋值的初始位置
    第一圈:(0,0);第二圈:(1,1);…以此类推
  2. 确定需要进行几圈循环赋值n/2
  3. 确定n为奇数和偶数时的不同情况
    n为奇数时:需要单独给中间元素赋值,mid = n / 2
    n为偶数时:循环赋值即可。
    4.确定每轮循环应该遍历的边长
    第一轮:n - 1;第二轮:n - 2;…以此类推
  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值