尺取法
- 问题描述: 给定一个数组An ,对该数组中的元素进行目标值求和或者判断是否是回文串、某个长度的区间值和目标值的关系、数组去重等操作。
- 常用情形: 通过两个指针对数组元素进行遍历,加快实现效率。
1、双向扫描
- 描述: 给定一个数组An ,求该数组中是否满足两个元素之和等于m。
- 解析:
- 暴力解: 从A0 作为目标元素开始进行遍历,从前往后遍历,查找是否存在元素能与目标元素相加等于m。时间复杂度O(n^2) 。
- 双向扫描: 先对数组进行排序,设定两个变量:i = 0, j = n - 1;通过二者对序列元素进行扫描,如果Ai + Aj > m,则j–,否则i++ 。这里需要对 i 进行多次的赋值,当i == n-1 时则意味着搜索结束。
2、回文串判断
- 描述: 给定一个字符串An ,求该字符串是否为回文串。
- 解析: 设定两个变量: i = 0, j = n - 1 ,判断Ai == Aj 是否成立,直到i >= j。如果中间出现该等式不成立,则说明该字符串不是回文串,反之则该字符串为回文串。
3、同向扫描
- 描述: 给定一个数组An ,求是否存在长度为k的子序列中,所以元素的乘积为m。
- 解析: 设定两个指针: i = 0, j = 0,构建变量Sum = Sum * Ai+j ;判断Sum < m在j < k && i <= n - k之前是否成立。如果成立则j++;否则Sum /= Ai,i++。
4、数组去重
- 描述: 给定一个数组An ,对数组中元素进行去重。
- 解析: 设定两个变量: i = 0, j = i + 1, k = n - 1,判断Ai == Aj 是否成立,如果成立,则将Aj 与Ak 互换位置。直到j >= k则i++ ,当i >= k结束去重。
参考网站:https://blog.csdn.net/weixin_43914593/article/details/104090474
注: 文章借鉴了该网站中的部分内容,私信立删