3月9日日报(双指针1)
- 完成双指针的学习与训练,做了三道相关简单题目,任重道远,慢慢刷 hot100 吧
- 基础太不牢固了,接着刷 hot100 能顺便巩固一下
- 背了一点点单词
- 顺便看一下 Java 的八股
- 继续看 趣味网络图解
双指针的学习
核心思想是原地修改
双指针算法的本质是利用两个移动速度或策略不同的指针,在不借助额外数组(空间复杂度 O(1))的情况下,完成对数组的筛选、移动或去重
- 第一个指针(快指针) 负责遍历整个数组,寻找符合要求的元素
- 第二个指针(慢指针) 负责指向“处理好的新数组”的末尾,即下一个好元素应该存放的位置
例子
移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作
class Solution {
public void moveZeroes(int[] nums) {
int n = nums.length, fast = 0, slow = 0;
while(fast < n) {
if (nums[fast] != 0) {
swap(nums, fast, slow);
slow++;
}
fast++;
}
}
public void swap(int[] nums, int fast, int slow) {
int temp = nums[fast];
nums[fast] = nums[slow];
nums[slow] = temp;
}
}