移动0(283)

先看代码

class Solution {
public void moveZeroes(int[] nums) {
int idx0 = 0;
for (int idx = 0; idx < nums.length; idx++){
if(nums[idx] != 0){
int temp = nums[idx0];
nums[idx0] = nums[idx];
nums[idx] = temp;
idx0++;
}
}
}
}
  • 分析

由于仅当 nums[idx] == 0 时 idx0和idx间距会扩大 即有idx0 ~idx 间都为0

idx0用于记录0的起始位置, idx 向前移动发现非0 填入idx0 idx0 向右移动

  • 感悟

双指针通过停一动一, 将两次遍历融合在一次遍历中, 同时维护两个指针, 处理两个数据

盛最多水的容器(011)

先看代码

class Solution {
public int maxArea(int[] height) {
int res = 0;
int lef = 0;
int rig = height.length - 1;
while (lef < rig){
int area = (rig - lef) * Math.min(height[lef], height[rig]);
res = Math.max(res, area);
if (height[lef] < height[rig]){
lef++;
}else rig--;
}
return res;
}
}
  • 分析

容器盛最多水由短板决定, 显然在相同短板下容器越宽越好 所以让左右板从最边缘开始

增大容器容量只能通过寻找更优最短板(lef++ OR rig--), 此时的 trade off 就是容器变窄

  • 感悟

双指针技巧特别适合需要同时考虑多个值的处理场景

三数之和(015)

先看代码

class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int n = nums.length;
Arrays.sort(nums);
for (int i = 0; i < n; i++){
if (nums[i] > 0) break;
if (i > 0 && nums[i] == nums[i-1]) continue; int lef = i+1;
int rig = n-1;
while (lef < rig){
int sum = nums[i] + nums[lef] + nums[rig];
if(sum == 0){
res.add(Arrays.asList(nums[i], nums[lef], nums[rig]));
while (lef < rig && nums[lef] == nums[lef+1]) lef++;
while (lef < rig && nums[rig] == nums[rig-1]) rig--;
lef++;
rig--;
}
else if(sum < 0) lef++;
else if(sum > 0) rig--;
}
}
return res;
}
}
  • 分析

分解问题成定一找二 寻找 nums[i] + nums[j] = - nums[k] 且 k < i, j < n-1

nums[k] 要和 (nums[i] + nums[j]) 为异号, 且当 nums[k] > 0 时结束

k < i , j < n-1 可行性分析

因为 nums[i] + nums [j] + nums[k] i, j, k 可相互替换

k 枚举了所有 nums[i] OR nums[j] OR nums[k] < 0的情况

先通过 sort 对原数组排序 →(方便去重 | 便于 nums[k] > 0 时结束 )

  • 感悟

写完了两数之和, 第一感觉是要以nums[k]作target , 取nums[i] + nums[j]作两数之和

但分析之后发现 还是用了二分

时间复杂度: 双指针O(n*logn + n²/2 ), hash O(n² + k(n))

双指针有 n²/2 因为只枚举小于0情况, 由实际动态浮动 , 这里就先取个2

k(n)指哈希计算、解决哈希冲突, 及哈希扩容

空间复杂度: 双指针O(1), hash O(n² → 利用hashset去重) 双指针在res中操作, 而hash 还要维护set

另外, hash代码实现比较麻烦 orz

接雨水(042)

先看代码

class Solution {
public int trap(int[] height) {
int res = 0;
int lef = 0;
int rig = height.length-1;
int preMax = 0;
int sufMax = 0;
while (lef < rig){
preMax = Math.max(preMax, height[lef]);
sufMax = Math.max(sufMax, height[rig]);
res += preMax > sufMax ? sufMax - height[rig--] : preMax - height[lef++];
}
return res;
}
}
  • 分析

通过维护全局两侧最高板, 采用了盛最多水的容器(011)的做法 寻找最优短板

对遍历到的块的接水量进行计算

  • 感悟

暂无

hot100之双指针的更多相关文章

  1. [LeetCode] #167# Two Sum II : 数组/二分查找/双指针

    一. 题目 1. Two Sum II Given an array of integers that is already sorted in ascending order, find two n ...

  2. [LeetCode] #1# Two Sum : 数组/哈希表/二分查找/双指针

    一. 题目 1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: Easy Given an array of ...

  3. Leetcode解题思想总结篇:双指针

    Leetcode解题思想总结篇:双指针 1概念 双指针:快慢指针. 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍. 在循环中的指针移动通常为: faster = f ...

  4. Longest Substring Without Repeating Characters - 哈希与双指针

    题意很简单,就是寻找一个字符串中连续的最长包含不同字母的子串. 其实用最朴素的方法,从当前字符开始寻找,找到以当前字符开头的最长子串.这个方法猛一看是个n方的算法,但是要注意到由于字符数目的限制,其实 ...

  5. leetcode 15. 3Sum 双指针

    题目链接 给n个数, 找出三个数相加结果为0的所有的组, 不可重复. 用双指针的思想,O(n^2)暴力的找, 注意判重复. class Solution { public: vector<vec ...

  6. hdu_5806_NanoApe Loves Sequence Ⅱ(双指针)

    题目链接:hdu_5806_NanoApe Loves Sequence Ⅱ 题意: 给你一段数,问你有多少个区间满足第K大的数不小于m 题解: 直接双指针加一下区间就行 #include<cs ...

  7. BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针

    BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针 Description Farmer John's owns N ...

  8. BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针

    BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针 Description Farmer John's N cows (1 <= N <= 100,000) ...

  9. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  10. (双指针 二分) leetcode 167. Two Sum II - Input array is sorted

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

随机推荐

  1. Next.js中间件权限绕过漏洞分析(CVE-2025-29927)

    本文代码版本为next.js-15.2.2 本篇文章首发在先知社区:https://xz.aliyun.com/news/17403 一.漏洞概述 CVE-2025-29927是Next.js框架中存 ...

  2. 流式计算(四)-Flink Stream API 篇二

    个人原创文章,禁止任何形式转载,否则追究法律责任! 本文只发表在"公众号"和"博客园",其他均属复制粘贴!如果觉得排版不清晰,请查看公众号文章. 话说看图看核心 ...

  3. 生命游戏Delphi实现

    生命游戏,康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序. 生命游戏没有游戏玩家各方之间的竞争,也谈不上输赢,可以把它归类为仿真游戏.事实上,也是因为它模拟和显示的 ...

  4. DevOps工程师

    DevOps工程师 1. DevOps工程师的任务是什么? 设计.构建.测试和部署可伸缩的分布式系统,实现从开发到部署的自动化 管理代码库(如Git.SVN.BitBucket等),包括代码合并与集成 ...

  5. 火焰图(Flame Graph)使用指南

    火焰图(Flame Graph) 是一种可视化性能分析工具,可以帮助你快速定位 CPU.内存或 I/O 瓶颈.它看起来像火焰,因此得名. 火焰图能解决什么问题? CPU 占用高:找出哪些函数消耗了最多 ...

  6. Clean DDD 技术沙龙 2025 杭州站

    整洁领域驱动设计(Clean DDD)第一次线下活动来了,这是: 一个软件设计的全新视角 一次复杂度掌控感的深度体验 一场软件工程效率的探索之旅 活动时间:2025年4月13日星期日 下午 13:00 ...

  7. springAPI对事物支持之XML式配置

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerData ...

  8. Java编程之容器类

    一.ArrayList 1.创建ArrayList对象 ArrayList<String> arr=new ArrayList<>(); //添加<>的为泛型 // ...

  9. 1、 为什么软件开发周期总是预估的2~3倍? 2、什么是分而治之? 3、了解 WBS

    1.为什么软件开发周期总是预估的2~3倍? 首先,软件开发中经常会有需求变更的情况,客户或者利益相关者可能会提出新的需求或者改变现有的需求,这就得调整计划,增加了开发时间.其次,开发人员的技术和经验也 ...

  10. Python3多线程

    一.进程和线程 进程:是程序的一次执行,每个进程都有自己的地址空间.内存.数据栈及其他记录运行轨迹的辅助数据. 线程:所有的线程都运行在同一个进程当中,共享相同的运行环境.线程有开始.顺序执行和结束三 ...