【算法学习——双指针算法(最长连续不重复子序列)】教程文章相关的互联网学习教程文章

微软算法面试(8):输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针【代码】

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。 分析: 单链表只能向后遍历,不能向前遍历,尾指针好找,倒数第K个不能从尾指针向前找。 倒的不好找,正的好找,我们只需要知道链表的总长度,就可以知道正数第几个节点(len(list) - k -1)。 实现如下: #include<iostream>using namespace std;struct ListNode{ListNode(int _v = 0):value(_v), next(NULL) {}int value;ListNode* nex...

双指针算法799.最长连续不重复子串【代码】

799.最长连续不重复子串 给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数n。 第二行包含n个整数(均在0~100000范围内),表示整数序列。 输出格式 共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。 数据范围 1≤n≤1000001≤n≤100000 输入样例: 5 1 2 2 3 5输出样例: 3思路: 自己写的版本 如以下序列: 1 2 3 4 5 6 4 7 当第二个4出现后,i = 1,...

LeetCode: 几数之和题解总结(双指针算法)【代码】

1 两数之和直接n平方复杂度,双指针减少一层复杂度; 或者可以采用哈希表class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> heap;for(int i = 0; i < nums.size(); i ++){if(heap.count(target - nums[i])) return {heap[target - nums[i]], i};//这一步在后面heap[nums[i]] = i;}return {};} };作者:coderhu1 链接:https://www.acwing.com/activity/content/code/content/6...

双指针算法.判断子序列【图】

AcWing.2816判断子序列用双指针 code:#include<bits/stdc++.h> using namespace std; const int N = 1e5+5; int n,m,a[N],b[N]; int read() {int f=1,ans=0;char c=getchar();while(c>9||c<0)if(c==-){f*=-1;c=getchar();}while(c>=0&&c<=9){ans=(ans<<3)+(ans<<1)+c-0;c=getchar();}return f*ans; } int main() {n=read();m=read();for(int i=1;i<=n;++i)a[i]=read();for(int i=1;i<=m;++i)b[i]=read();int i=1,j=1;while(i<=n&...

双指针与滑动数组算法总结【代码】【图】

#双指针分类 **1.左右指针 例题:反转链表 class Solution { public: ListNode* reverseList(ListNode* head) { //三个指针分别表示前一个节点,当前节点和下一个节点 ListNode *pre=NULL; ListNode *cur=head; ListNode* next; while(cur) { next=cur->next; cur->next=pre; pre=cur; cur=next; } return pre; } }; 2.对撞指针(解决有序数组的数字之和或反转数组之类的可以两边开工的问题) 模板:指定指针初始位置,设置指针移...

常见算法-02-双指针【代码】【图】

2 双指针 2.1 介绍算法思想双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。 若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域即为当前的窗口),经常用于区间搜索。 若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是排好序的。2.2 Two Sum问题 167. 两数之和 II - 输入有序数组(Easy)分析由于给...

【算法笔记】用指针实现小顶堆【代码】

本文将讨论指针堆与数组堆的区别,和指针堆的具体实现方式。 题目:洛谷P3378 啊对了,下文不会解释指针是什么、指针的用法、为什么加“&”等基础问题,需要的建议去看《算法竞赛入门经典训练指南》中指针版名次数(treap)的实现,或是向懂的小伙伴提问。 一 指针与数组的比较 数组版中,由于下标的特殊性质,我们可以快速找到某个节点的父亲节点。所以在数组版中,大多使用的是从叶子往根节点更新的插入/删除方式。同时,数组版的原...

LeetCode日记——【算法】双指针专题【代码】

题1:两数之和 II - 输入有序数组(Two Sum II - Input array is sorted) Leetcode题号:167 难度:Easy 链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/ 题目描述: 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输...

剑指offer(Java版)第六题:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。

/*给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。*/ import java.util.*; public class Class7 { class TreeLinkNode{ int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode parent = null; TreeLinkNode(int val){ this.val = val; } } public TreeLinkNode findNextNode(TreeLinkNode nod...

算法笔记--野指针问题【代码】

野指针:一个指针在free之后没有被赋值成NULL。 造成野指针的原因:在函数free(p)中只是将P指针的值传递给了函数,仅仅是释放了形参的值,实参的值并没有改变, 并且malloc函数在操作系统分配的时候是顺序分配(比如释放了的p原本使用的地址为2000, 那么下一次malloc分配的地址就是这个2000),如果继续对p进行解引用的话, 会连同下一次动态分配的指针所指向的值一同改变。 举个栗子: #include<stdio.h> #include<stdlib.h>in...

算法学习——双指针算法(最长连续不重复子序列)【代码】【图】

双指针算法本质上就是将具有单调性的算法复杂度为O(N^2)的朴素算法通过双指针优化到O(n)的一种优化方法。是一种十分常用的算法。 设计双指针算法我们一般先写出它的朴素算法,然后按照模板: for( int i = 0, j = 0 ; i < n ; i ++) {//check()是按照题目逻辑的判断函数while( j <= i && check() ){//不满足时j ++;}//此处是按照题目逻辑的解答过程。}将其转换为双指针算法。 例题:最长连续不重复子序列 题解代码:#include<io...

判断循环链表 (C语言如何应用快慢指针) ------- 算法笔记004【代码】【图】

概念快慢指针判断链表是否有环Bool ifLoopOfList(List head){List quick=NULL;List slow=NULL;quick=slow=head;do{quick=quick->next->next;slow=slow->next;printf("quick->%d\tslow->%d\n",quick->data,slow->data);if(quick==slow){return 1;}}while(quick);return 0;} 工程文件 #include <stdio.h> #include <stdlib.h> typedef struct node{int data;struct node *next; }Node,*List; typedef int Bool; List createLoopList...

[二叉树算法]让树所有叶子节点连成一个单链表,让rchild作为 next指针【代码】

//让树所有叶子节点连成一个单链表,让rchild作为 next指针 LNode *head=null,*pre=null;//全局变量 LNode *InOrder(BTNode *T){if(T!=null){InOrder(T->lchild);if(T->lchild==null && T->rchild==null){if(pre==null){pre=T;head=T;}else{pre->rchild=T;pre=T;}}InOrder(T->rchild);pre->rchild=null;}return head; }

双指针算法【代码】【图】

双指针算法: 一般分为两种: 第一种:两个指针在同一个序列,一般维护一个区间满足某种性质,比如下面的最长上升子序列那个算法1 #include <iostream>2 #include <vector>3 #include <unordered_map>4 5 using namespace std;6 7 const int N = 1e6+10;8 9 unordered_map<int,int> m; 10 vector<int> arr(N,0); 11 int n, res = 0; 12 13 int main(){ 14 cin >> n; 15 for(int i = 0;i < n;++i) 16 cin >> arr[i...

LeetCode刷题笔记NO.11和NO.15,双指针算法【代码】【图】

NO.11 盛最多水的容器 给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器,且 n 的值至少为 2。 图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例: 输入: [1,8,6,2,5,4,8,3,7]...