优选算法精讲(专题一)

双指针_移动零

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

思路:采用快排的思想:数组划分区间-数组划分两块

双指针:

cur:从左往右扫描数组,遍历数组,遇到0不用管,遇到非零的swap

dest:已处理的区间内,非零元素的最后一个位置

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

双指针_复写零

1089. 复写零 - 力扣(LeetCode)

思路:原地复习-双指针。我们可以现根据"异地操作",然后优化成双指针下的"就地"操作

如果从前往后进行原地复写操作的话,由于0的出现会导致后面还未复写的数被覆盖掉,所以我们选择从后往前复写:

1、在复写之前,我们需要找到最后一个复写的数:

a.先判断cur位置的值

b.再决定dest向后移动一步或者两步

c.然后再判断dest是否已经到达结束位置

d.然后才是cur++

2、处理边界情况

dest 的n-1=0

cur --

dest-=2;

3、完成从后往前的腹泻操作

快乐数

202. 快乐数 - 力扣(LeetCode)

结合题目描述和实例分析可知,两种情况:进入到全是1的循环;进入到历史数据的死循环里

思路,使用快慢指针来解决:

先定义指针,然后慢指针每次向后移动一位,快指针向后移动两位。由于最终会进入循环,所以二者必定能够相遇。判断相遇时的值是否等于1即可。

盛水最多的容器

11. 盛最多水的容器 - 力扣(LeetCode)

依旧双指针

思路:一般肯定想到暴力枚举,但肯定是时间复杂度过不了的。但我们可以根据暴力枚举演变一种新的思路:

设想,从数组两端开始,先计算出一个体积,体积=w乘h。当我们向内移动指针时,我们可以发现一个规律,水平宽度会一直减小 ,此时体积v的大小还受到高度h的影响。

此时有两种情况:

1、后续遇到更高或者相等高的柱子,则h不变,但由于向内移动,w会一直变小,所以体积v整体仍在减小。此时体积计为v1

2、若后续遇到比他更低的柱子,则此时h变小,但由于向内移动,w会一直变小,所以体积v整体只会更小。此时体积计为v2

我们移动一次指针(这里移动高度小的一边,原因根据上面的理解就能明白了),就记录体积,然后与移动前的体积相比取较大的。

相关推荐
用户979984807183 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks3 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea3 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术4 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术4 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户0441440924494 小时前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠4 小时前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试
得物技术4 小时前
别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?
人工智能·算法·llm
罗西的思考4 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(4)--- Rollout实现细节
人工智能·算法
罗西的思考4 小时前
机器人 / 物理 Agent Harness 综合分析与对比:从「更强的模型」到「更好的系统」
人工智能·算法·机器学习