IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 七日算法先导(二)——双指针 -> 正文阅读

[数据结构与算法]七日算法先导(二)——双指针

作业解答

昨天作业都比较简单,我挑几个小伙伴反应的疑惑说一下:
增量元素之间的最大差值

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初始化为其他值,那么可能出现跳过第一个值或者初始值不在数组中的情况

674. 最长连续递增序列 - 力扣(LeetCode)

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入门双指针

入门是不够的,下面我们来看双指针的三种情况:

  1. 数组相向追赶
  2. 数组相向逼近
  3. 链表快慢指针(有点难)

数组相向追赶

俩个指针,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;

刷题巩固

双调序列
判断子序列
排列排序
俩数之和||

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 11:07:37  更:2022-08-06 11:11:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:29:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码