双指针可以说是非常经典的算法了,但是这里可能会存在一个误区,双指针是否一定是指针呢?

答案是否定的,它只是一种算法的思想。首次接触是在链表那里,后面又碰到了很多这种思想,所以来总结一下。

双指针也分为好多种:

1.左右双指针

2.快慢双指针

3.嵌套双指针

4.滑动窗口双指针

这篇文章就先说说第一个。

1.左右双指针:

我们用一道题来说明:

1.给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]

输出:[1,3,12,0,0]

示例 2:输入: nums = [0]

输出:[0]

该题出自leetcode283题,非常具有代表性。

思路:

1.定义两个指针,分别为left和right。

2.将原数组区间分为三部分:[0——left]为非零元素,[left+1——right-1]为零元素,[right——length-1]为未处理的元素。

3.让right一直向前走,遇到零时不做操作,遇到非零时和left+1交换(因为可以保证left+1的位置是0)

3.只要一直保持这三个数组的状态不变,当right=length-1时,操作完成。

代码:

class Solution {

    public void moveZeroes(int[] nums) {

        int left=-1 ,temp;

        for(int right=0;right<nums.length;right++)

        {

            if(nums[right]!=0)

            {

                left++;

                temp=nums[left];

                nums[left]=nums[right];

                nums[right]=temp;

            }

        }

    }

}