七日算法先导(二)——双指针
2023-02-18 16:27:09 时间
作业解答
昨天作业都比较简单,我挑几个小伙伴反应的疑惑说一下: 增量元素之间的最大差值
int max(int a,int b){
return a>b?a:b;
}
int min(int a,int b){
return a<b?a:b;
}
int maximumDifference(int* nums, int numsSize){
int maxS = -1;//最大差为-1
int minS = nums[0];//最小元素为nums[0]
//遍历数组,时间复杂度为O(n)
for(int i = 1; i<numsSize;i++){
int sub = nums[i] -minS;
if(sub > 0){
//更新
maxS = max(sub,maxS);
}
//更新最小
minS = min(nums[i],minS);
}
return maxS;
}
其中这个最小元素为啥要初始化为nums[0],简单的来说我们是从左到右遍历数组的,nums[i]每次减minS,假设minS初始化为其他值,那么可能出现跳过第一个值或者初始值不在数组中的情况
class Solution {
public int findLengthOfLCIS(int[] nums) {
//双指针(假的滑动窗口)
if(nums == null || nums.length == 0) return 0;
int i = 0, j = 1, ans = 1;
while(j < nums.length){
if(nums[j] > nums[j-1]){
j++;
}else{
i = j;
j++;
}
ans = Math.max(ans, j-i);
}
return ans;
}
}
昨天这个题,就可以考虑用双指针来写,当然昨天的暴力解法也是正确的。
思路: 当nums[j] > nums[j-1] 的时候就是左边大于本身满足条件,j++ 否则的话,就不连续了,i变为j 最后比较最长序列,ans,和,j-i中选取最大的
概念
参考我之前写过的这篇文章: 从0到1入门双指针
入门是不够的,下面我们来看双指针的三种情况:
- 数组相向追赶
- 数组相向逼近
- 链表快慢指针(有点难)
数组相向追赶
俩个指针,i可以一直往前走,但是j只有当满足条件的时候才往前走
数组相向逼近
一般来说,俩个指针从数组的俩端开始,不断的去check是否满足条件,根据不同的条件,来选择是左指针自增,还是右指针自减
链表快慢指针
快慢指针,顾名思义,定义俩个指针,一个指针可以走的很快,另一个相对走的较慢,当快指针走到链表结尾,慢指针对应的节点,获取一些信息,从而解决一些问题。
slow = slow.next;
fast = fast.next.next;
假设快慢指针原来都指向头结点,这样的话,fast指针移动速度就是slow指针的两倍,这是很有用的设计
例如: 找到链表中点
int length = 0;
ListNode node = head;
// 遍历一遍链表得到链表长度
while(node!=null){
node = node.next;
length ++;
}
// 根据得到的链表长度,可以遍历长度/2次来找到终点
ListNode centerNode = head;
for(int i=0;i<length/2-1;i++){
centerNode = centerNode.next;
}
上面的方法遍历了N+N/2次,且代码略显复杂,最后遍历长度/2次时,要注意centerNode节点实际上是中点的下一个节点,所以可以让遍历次数-1来得到中点.
下面是使用了快慢节点的做法:
// 快慢指针起点相同
ListNode slow = head;
ListNode fast = head;
while(fast.next!=null && fast.next.next!=null){
slow = slow.next;
// 快指针移动速度为慢指针两倍
fast = fast.next.next;
}
// 当快指针到达链表表尾时,此时慢指针指向链表中点
ListNode centerNode = slow;
刷题巩固
相关文章
- 数据结构001:最大子数组和
- 数据结构002:买卖股票的最佳时机
- 怎样优化Vue项目
- 数据结构003:有效的数独
- 家电行业的数字化升级:电子采购平台系统如何助力企业降本增效,提升采购协同效率?
- 六西格玛工具:柏拉图
- 友元类和嵌套类
- RTTI和类型转换运算符
- YAML快速入门
- 提升汽配供应链效率,S2B2C电商系统实现企业库存管理智能化
- 虚拟现实 VR 碰撞 3D 可视化,图扑打造一体化管控平台
- 一篇文章教你实战Docker容器数据卷
- 一起从零到一手写迷你版Vue
- 一起实现React-Hooks核心原理
- 内部群炸锅了,同事又删库了
- 一女程序员因薪酬问题离职,rm -f * 删库,瘫痪6个小时,被判9个月
- 广域铭岛参编《数智化供应链参考架构》标准正式发布
- 每周 Postgres 世界动态 2022w49
- 公司架构师常常提起的DNS负载均衡是个什么鬼?
- react-Suspense的工作原理解析