双指针可以说是非常经典的算法了,但是这里可能会存在一个误区,双指针是否一定是指针呢?
答案是否定的,它只是一种算法的思想。首次接触是在链表那里,后面又碰到了很多这种思想,所以来总结一下。
双指针也分为好多种:
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;
}
}
}
}
发表评论