写这个系列是为了记录我所学习的模块,进行分析 + 总结 + 归纳。如果你也对算法感兴趣,可以跟着我一起学习总结,我会在我理解明白了的基础上,进行尽可能详细,通俗易懂的语言进行表达。
目录
(1) 移动零 283. 移动零 - 力扣(LeetCode)
(2) 复写零 1089. 复写零 - 力扣(LeetCode)
(3)快乐数 202. 快乐数 - 力扣(LeetCode)
(4) 盛水最多的容器 11. 盛最多水的容器 - 力扣(LeetCode)
1. 是什么
双指针,顾名思义就是使用两个指针解决问题。分为:对撞指针、快慢指针,对于解决数组,循环问题有很大的帮助。
2 .题目解析
(1) 移动零 283. 移动零 - 力扣(LeetCode)
对于这道题是想要移动一下 0 ,我们可以采用数组分块的思想。通过 left ,right 两个指针将区域分为3个部分,实数区、0区、未检测区。
开始时 left 指针指向了 -1 这个位置,right 指向 0。当 right 指向了 0 就不用管 right++,如果是right 指向了非零数字需要对于 left++ ,之后再交换 left 和 right , right++再判断是否为0;以left < right 为结束条件进行终止。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int left = -1;
int n = nums.size();
int right = 0;
for(right = 0; right < n;)
{
if(nums[right] == 0)
{
right++;
}
else
{
left++;
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
right++;
}
}
}
};
还可进行优化,去除掉重复的部分。这就是算法的魅力。
标签:right,nums,int,妙趣,---,++,算法,指针,left From: https://blog.csdn.net/2405_85784684/article/details/142288246