【算法专题突破】双指针 - 移动零(1)

简介: 【算法专题突破】双指针 - 移动零(1)

写在前面

在进行了剑指Offer和LeetCode hot100的毒打之后,

我决心系统地学习一些经典算法,增强我的综合算法能力。

1. 题目解析

题目链接:283. 移动零 - 力扣(Leetcode)

读完题目大概就能明白他的意思,

就是在不改变其他数字的情况下,把0都移动到数组最后面去。

2. 算法原理

这道题算是一道数组类的题目,而题目把数组分成了两个区间,

左边是放非0的数,而右边放的是0,

而解决这一类的题目有一个非常经典的算法:双指针算法,

说到双指针算法,难道我们真的要用两个指针来做这道题目吗?

当然不是,双指针只是他的名字,实际上双指针算法指的是:

利用数组下标来充当指针,

那我们如何使用双指针算法来做这道题目呢?

我习惯创建两个变量作为双指针:left 和 right,

1. right 的作用是遍历整个数组

2. left 的作用是作为分界线,左边区间是已经排好的,右边区间是还没排好的

让 right 一直往后走(right++),

如果 right 所在的位置不为 0 ,就交换 left 和 right 位置的值,让 left ++,

因为 left 和 right 的起始位置相同,

这样就能保证当他们开始交换的时候,left 一定待在 0 位置上,而 right 在非 0 位置上。

来我们开始编写代码:

3. 代码编写

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int size = nums.size(), left = 0, right = 0;
        while (right < size) {
            if(nums[right]) {
                swap(nums[left], nums[right]);
                left++;
            }
            right++;
        }
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章
|
4月前
|
算法
双指针算法
双指针算法
29 2
|
1月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
34 4
双指针算法详解
|
1天前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
4月前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
2月前
|
算法 容器
【算法】双指针
【算法】双指针
|
2月前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
5月前
|
算法
【优选算法】——双指针——15. 三数之和
【优选算法】——双指针——15. 三数之和
【优选算法】——双指针——15. 三数之和
|
5月前
|
存储 人工智能 算法
c++算法学习笔记 (9) 双指针
c++算法学习笔记 (9) 双指针
|
5月前
|
算法
[优选算法]——双指针——Leetcode——1089. 复写零
[优选算法]——双指针——Leetcode——1089. 复写零