hot100之双指针
移动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之双指针的更多相关文章
- [LeetCode] #167# Two Sum II : 数组/二分查找/双指针
一. 题目 1. Two Sum II Given an array of integers that is already sorted in ascending order, find two n ...
- [LeetCode] #1# Two Sum : 数组/哈希表/二分查找/双指针
一. 题目 1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: Easy Given an array of ...
- Leetcode解题思想总结篇:双指针
Leetcode解题思想总结篇:双指针 1概念 双指针:快慢指针. 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍. 在循环中的指针移动通常为: faster = f ...
- Longest Substring Without Repeating Characters - 哈希与双指针
题意很简单,就是寻找一个字符串中连续的最长包含不同字母的子串. 其实用最朴素的方法,从当前字符开始寻找,找到以当前字符开头的最长子串.这个方法猛一看是个n方的算法,但是要注意到由于字符数目的限制,其实 ...
- leetcode 15. 3Sum 双指针
题目链接 给n个数, 找出三个数相加结果为0的所有的组, 不可重复. 用双指针的思想,O(n^2)暴力的找, 注意判重复. class Solution { public: vector<vec ...
- hdu_5806_NanoApe Loves Sequence Ⅱ(双指针)
题目链接:hdu_5806_NanoApe Loves Sequence Ⅱ 题意: 给你一段数,问你有多少个区间满足第K大的数不小于m 题解: 直接双指针加一下区间就行 #include<cs ...
- 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 ...
- BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针
BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针 Description Farmer John's N cows (1 <= N <= 100,000) ...
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
- (双指针 二分) 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 ...
随机推荐
- linux(centos)配置ipv6网卡
1.ipv6网卡配置文件和ipv4在同一个网卡配置文件中 vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置好之后重启网卡生效 2.测试
- Pydantic Mixin:构建可组合的验证系统体系
title: Pydantic Mixin:构建可组合的验证系统体系 date: 2025/3/22 updated: 2025/3/22 author: cmdragon excerpt: Pyda ...
- Delphi 让窗体自适应屏幕显示
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
- 深入理解Hadoop读书笔记-1
背景 公司的物流业务系统目前实现了使用storm集群进行过门事件的实时计算处理,但是还有一个需求,我们需要存储每个标签上传的每条明细数据,然后进行定期的标签报表统计,这个是目前的实时计算框架无法满足的 ...
- C# 窗口过程消息处理 WndProc
C# 窗口过程消息处理 WndProc WinForm WndProc 在 WinForm 中一般采用重写 WndProc 的方法对窗口或控件接受到的指定消息进行处理 示例:禁止通过关闭按钮或其他发送 ...
- 字符串匹配究极大招【KMP】:带你一步步从原理到构建
目录 前言 KMP原理 什么是前缀表 如何构建前缀表 next数组 使用next数组做匹配 实战演练 前言 一文带你了解如何去理解并实现KMP算法.本文用于记录自己的学习过程,同时向大家进行分享相关的 ...
- .NET 原生驾驭 AI 新基建实战系列(四):Qdrant ── 实时高效的向量搜索利器
向量数据库作为一种专为现代AI应用设计的新型存储技术,能够高效地管理和检索高维数据,成为智能应用开发中的关键基础设施.本文将深入探讨 Qdrant 这个开源.高性能的向量数据库,重点介绍其如何与 .N ...
- HTML5和CSS3基础
HTML元素 空元素 不是所有元素都拥有开始标签.内容和结束标签.一些元素只有一个标签,通常用来在此元素所在位置插入/嵌入一些东西.这些元素被称为空元素例如:元素 `` 是用来在页面插入一张指定的图片 ...
- 代码随想录第二十一天 | Leecode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
Leecode 669. 修剪二叉搜索树 题目描述 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修 ...
- 【记录】Pandoc|Linux安装最新Pandoc
参考:官方文档,https://pandoc.org/installing.html 系统:Ubuntu 注意!Pandoc 不能接受 PDF 作为输入!!!如果是想下载 Pandoc 做 PDF 格 ...