https://leetcode-cn.com/problems/move-zeroes/
public void moveZeroes(int[] nums) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
//只要不为0就往前挪
if (nums[j] != 0) {
//i指向的值和j指向的值交换
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
}
}
}
类似快排算法,小于0的放到左边,大于0的放到右边
移动0的逻辑是:不等于0的放到左边,等于0的放到右边
中间位置就0,且是固定的,快排的中间位置是动态变化的
两个指针
- 指针j:从左到右边迭代往前一步一个元素移动,每次循环都移动一个位置;
- 指针i:从位置0开始;
- 如果指针j==0则指针j继续向前移动,当前位置如果为0则不做任何操作直接迭代往前;
- 如果指针j!=0则指针i和指针j互相交换位置,且指针i位置往前移动一个,指针j继续移动
思考:
双指针的类型:
- 两个指针同向移动
- 两个指针相向移动
- 两个指针背向移动
- 移动的时候步长一样
- 移动的时候步长不一样
- 移动的时候可以用for循环驱动移动
- 移动的时候可以用while循环驱动移动
双指针一般涉及的数据结构
- 数组
- 字符串
- 链表
- 队列
常见的算法类型:
- 原地移动位置
- 逆序操作
- 排序