LeetCode算法笔记:双指针法解题实例977有序数组平方与209最小连续子数组

需积分: 0 0 下载量 148 浏览量 更新于2024-08-03 收藏 4KB MD 举报
### 题目解析与思路 ### 977.有序数组的平方 在这个题目中,我们需要对一个非递减有序数组`nums`中的每个元素进行平方操作,并保持结果数组的非递减顺序。使用双指针策略是关键。初始化两个指针`left`和`right`,分别指向数组的起始和结束。每次比较`nums[left]`和`nums[right]`的平方,将较大的平方值添加到结果数组`result`的末尾,并根据比较结果移动相应指针。如果`nums[left]`的平方大于`nums[right]`的平方,说明左端的元素平方更大,`left`指针向右移动一位;反之,`right`指针向左移动一位。当`left`超过`right`时,循环结束,返回结果数组`result`。 ### 209.长度最小的子数组 这个问题要求找到数组中和至少等于`target`的最小子数组,这个子数组必须是连续的。我们可以通过滑动窗口的方法解决。首先,定义两个指针`start`和`end`,初始时`start = end = 0`。然后遍历数组,每次将`end`指向的元素加到当前和`sum`中,同时检查`sum`是否大于或等于`target`。如果大于或等于,说明找到了一个满足条件的子数组,更新最小长度为`end - start + 1`。如果`sum`小于`target`,则尝试减少子数组的右边界`end`,直到`sum`不再小于`target`。当遍历完整个数组后,返回找到的最小子数组的长度。 ### 螺旋矩阵II 这道题目涉及的是二维矩阵的螺旋遍历。给定一个矩阵,你需要按照顺时针或逆时针方向,从左上角开始沿着螺旋路径遍历矩阵,直到到达右下角。这个过程可以用四个变量`dx`(水平移动)、`dy`(垂直移动)、`cur`(当前位置)和`dir`(方向,0代表上,1代表右,2代表下,3代表左)来控制。在每次迭代中,根据`dir`更新`cur`的位置,并判断是否到达矩阵的边界。如果到达边界,改变方向并重新调整移动步长。最后返回遍历过的路径。 ### 学习点总结 通过这些题目,你可以学到: 1. 双指针技巧:用于处理数组和区间相关的问题,如有序数组的平方和查找满足条件的子数组。 2. 滑动窗口思想:用于解决求和、区间查询等问题,如长度最小的子数组。 3. 区间设置:如何根据题目需求设定合适的窗口或区间范围。 4. 边界条件处理:注意处理奇偶边界以及矩阵边界条件,避免溢出或提前终止。 5. 算法思维:从问题描述到逻辑设计,再到代码实现的过程,培养抽象和分解复杂问题的能力。 通过逐题练习,不断优化和调整策略,你会逐渐熟悉这些算法并提升编程技能。记得对比自己的实现和参考答案,找出不足,逐步提高解题效率和准确性。