经典双指针算法试题(一)

简介: 经典双指针算法试题(一)

一、移动零


1、题目讲解

15dddda74f7246b895133a5c4f7e1f6b.png


2、讲解算法原理

013a363b8bf3498f8cb46672eaf0a010.png


3、代码实现

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



二、复写零


1、题目讲解

0223b28e94a04ed89d7257964cdc57e9.png

2、讲解算法原理


a4c92defda38493992805bc13bc6debd.png

310fcb845fdb44579577e1f0df328668.png


b3cc98573e3344d58173d0d595e3bbd8.png

2b94672f02b94cf19347d89ff864e508.png

3、代码实现

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur=0,dest=-1,n=arr.size();
        while(cur<n)
        {
            if(arr[cur]) dest++;
            else dest+=2;
            if(dest>=n-1) break;
            cur++;
        }
        if(dest==n)
        {
            arr[n-1]=0;
            cur--;
            dest-=2;
        }
        while(cur>=0)
        {
            if(arr[cur]) arr[dest--]=arr[cur--];
            else 
            {
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }  
        }  
    }
};



三、盛水最多的容器


1、题目讲解

eea9d7d4979241aaba55c1efaa233daa.png

137610613efb4c86a8cd58f046ec849b.png

2、讲解算法原理

84429169611f4a12b6e3dd542277bacc.png

3、代码实现

class Solution {
public:
    int maxArea(vector<int>& height) {
        int max=0,begin=0,end=height.size()-1;
        while(begin<end)
        {
            if(height[begin]>height[end])
            {
                int v1=height[end]*(end-begin);
                if(v1>max)
                max=v1;
                --end;
            }
            else
            {
                int v2=height[begin]*(end-begin);
                if(v2>max)
                max=v2;
                ++begin;
            }
        }
        return max;
    }
};



四、快乐数


1、题目讲解

002073a83e16440ea9ad0dce4af08b3c.png

2、讲解算法原理

899b9f08d1804ad492f9cc5800fb0db8.png

3、代码实现

class Solution {
public:
    int bigsum(int n )
    {
        int sum=0;
        while(n)
        {
            int ret=n%10;
            sum+=ret*ret;
            n/=10;
        }
        return sum;
    }
    bool isHappy(int n) {
        int slow=n,fast=bigsum(n);
        while(fast!=slow)
        {
            fast=bigsum(bigsum(fast));
            slow=bigsum(slow);
        }
        return slow==1;
    }
};


目录
相关文章
|
25天前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
3月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
46 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
4月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
89 4
|
3月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
3月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
5月前
|
算法 容器
【算法】双指针
【算法】双指针
|
5月前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
215 13
|
3月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
47 0