算法合集
记录自己刷算法的一些心得
junlaii
这个作者很懒,什么都没留下…
展开
-
DFS图遍历+路径地图
题号:剑指 Offer II 112. 最长递增路径 难度:hard 题目:给定一个 m x n 整数矩阵 matrix ,找出其中。对于每个单元格,你可以往上,下,左,右四个方向移动。不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。最长递增路径 的长度。原创 2023-04-13 13:36:32 · 245 阅读 · 0 评论 -
二位数组中的查找(时间复杂度优化为O(N))
解题思路从矩阵左下角开始走路,小于target向上走一步,大于target向右走一步class Solution {public: //从矩阵左下角开始走路,小于target向上走一步,大于target向右走一步 bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { int n = matrix.size(),m; if(n>0){原创 2022-04-28 09:15:52 · 139 阅读 · 0 评论 -
求有序矩阵的第k小元素 (二分思路)
解题思路二分查找,将二维转化为一维,check函数用于求解小于等于target的元素数量与k的关系代码class Solution {public: //统计满足小于target的数组元素数量,超过k返回true,没超过k返回false bool check(vector<vector<int>>& matrix, int cnt,int target,int k){ int num = 0; int i = cnt.原创 2022-04-22 12:55:38 · 270 阅读 · 0 评论 -
Dijkstra算法实现求解图矩阵最短路(使用C#)
思路:单源顶点的最短路径扩散using System;using System.Collections.Generic;using System.Text;using static System.Console;namespace DataStructure.graph{ class Adjacency2//邻接矩阵初始化 { public static int INFINTE = 99999; public int[,] graph_ma.原创 2022-04-09 19:01:58 · 506 阅读 · 0 评论 -
买卖股票的最佳时机 II(贪心思想)
问题:算法复杂度o(n)class Solution {public: int maxProfit(vector<int>& prices) { int cnt = prices.size(); int maxm=0; for(int i=1;i<cnt;i++){ int diff = prices[i]-prices[i-1]; maxm = max(m.原创 2022-04-05 18:14:46 · 63 阅读 · 0 评论 -
求多源路径的最短路(使用Floyd算法)
思路:Floyd对算法最短路做枚举更新using System;using System.Collections.Generic;using System.Text;using static System.Console;namespace DataStructure.graph{ class Adjacency { static int INFINUTE = 99999; public int[,] graph_matrix; ..原创 2022-04-05 17:43:01 · 233 阅读 · 0 评论 -
根据前序和中序序列构造二叉树
思路:数据结构中的分治思想,更具前序和中序递归构造二叉树class Solution {private: unordered_map<int, int> index;public: TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int i.原创 2022-04-03 19:36:25 · 1492 阅读 · 1 评论 -
迷宫寻路算法(使用栈)
使用c#思路:从起点出发,走0代表可达路径,并用数字2标记已走路径,死胡同就弹栈,直到终点using System;using System.Collections.Generic;using System.Text;using static System.Console;namespace DataStructure{ public class Node//路径节点 { public int x, y; public Node next;.原创 2022-04-02 17:59:06 · 403 阅读 · 0 评论 -
java自实现hashmap数据结构
Design a HashMap without using any built-in hash table libraries.Implement the MyHashMap class:MyHashMap() initializes the object with an empty map. void put(intkey, int value) inserts a (key, value) pair into the HashMap. If thekey already exists in .原创 2022-01-21 23:55:20 · 442 阅读 · 0 评论 -
20多行代码设计简单双值存储哈希set结构
题目:Design a HashSet without using any built-in hash table libraries.Implement MyHashSet class:void add(key) Inserts the value key into the HashSet. boolcontains(key) Returns whether the value key exists in the HashSet ornot. void remove(key) Removes t.原创 2022-01-21 14:09:29 · 284 阅读 · 0 评论 -
虚拟头节点指针法实现链表删除指定值的节点
Given the head of a linked list and an integer val, remove all the nodes of the linked list that has Node.val == val, and return the new head./** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * Lis原创 2022-01-20 21:54:46 · 384 阅读 · 0 评论 -
左右指针-滑动窗口法找出没有重复字母的最长子串
找出没有重复字母的最长子串思路:通过map集合记录每个不同字符的索引位置,右指针每次移动时检索该索引,如果之前出现了,更新字符的索引值,并用max标识记录下循环中出现的最长字符串长度。class Solution { public int lengthOfLongestSubstring(String s) { if (s.length()==0) return 0; HashMap<Character, Integer> map = new .原创 2022-01-16 11:39:15 · 156 阅读 · 0 评论 -
双指针法去除链表指定位置的节点
Given the head of a linked list, remove the nth node from the end of the list and return its head.思路:双指针法,用p指针标记要删除位置,当先指针抵达尾部时,删除p标记的位置节点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * List原创 2022-01-15 23:34:01 · 365 阅读 · 0 评论 -
双指针法剪枝链表
快慢指针标记链表中点,折半链表思路:快指针速度为2,慢指针速度为1,当快指针走完链表时,返回慢指针地址/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} *原创 2022-01-15 23:18:22 · 89 阅读 · 0 评论 -
反转字符串中的单词
对字符串的单词进行反转思路,利用过程双指针定位每个单词起始坐标,首尾反转。class Solution {public: string reverseWords(string s) { int n = s.length(); //反转起始 for(int i=0,start;i<n-1;){ //标记反转单词的初始位置 start = i; //i指针到达单词结尾原创 2022-01-15 23:03:33 · 118 阅读 · 0 评论 -
循环队列是一种顺序存储结构,首尾指针大小不一定
原创 2022-01-04 14:44:27 · 583 阅读 · 0 评论 -
指针变化复制带随机指针的链表
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复原创 2022-01-04 01:18:36 · 359 阅读 · 0 评论 -
双指针法分割链表
将链表分割成左边大于某个值,右边小于某个值的链表,时间复杂度O(N)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x,原创 2022-01-03 23:13:50 · 616 阅读 · 0 评论 -
双指针判别法保留链表只出现一次的节点
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。 示例 1:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3]输出:[2,3]/** * Definition for singly-linked list. * struct ListNode { * int v..原创 2022-01-03 01:15:45 · 52 阅读 · 0 评论 -
指针偏移法删除链表重复元素
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。 示例 1:输入:head = [1,1,2]输出:[1,2]示例 2:输入:head = [1,1,2,3,3]输出:[1,2,3]/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *nex..原创 2022-01-03 00:58:36 · 404 阅读 · 0 评论 -
双指针法删除链表指定位置节点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode.原创 2022-01-03 00:46:49 · 91 阅读 · 0 评论 -
巧用单循环链表解决旋转链表问题
问题:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1:输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]示例 2:输入:head = [0,1,2], k = 4输出:[2,0,1]/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *原创 2022-01-03 00:27:33 · 218 阅读 · 0 评论 -
K 个一组翻转链表(递归算法)
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例 1:输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]示例 2:输入:head = [1,2,3,4,5], k = 3输出:[3原创 2022-01-03 00:01:36 · 80 阅读 · 0 评论 -
指定区间的局部链表反转
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]示例 2:输入:head = [5], left = 1, right = 1输出:[5]/** * Definition for singly-linked lis原创 2022-01-01 21:57:12 · 157 阅读 · 0 评论 -
三指针法和递归法实现链表反转
使用三指针法实现链表逆转,时间复杂度为O(N)给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]/** * Definition for singly-linked list. * struct ListNode { * int val; * .原创 2022-01-01 21:00:01 · 101 阅读 · 0 评论 -
快乐数问题(快慢指针法)
编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 true ;不是,则返回 false 。 示例 1:输入:n = 19输出:true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1示例 2原创 2022-01-01 17:33:38 · 112 阅读 · 0 评论 -
环形链表寻找环的起点位置(快慢指针)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *detectCycle(ListNode *head) { if(head == nullptr){原创 2022-01-01 17:07:59 · 157 阅读 · 0 评论 -
环形链表快慢指针法的两种实现方式
方法一/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: bool hasCycle(ListNode *head) { //初始判断 if(head ==.原创 2022-01-01 16:32:58 · 147 阅读 · 0 评论 -
使用双数组实现线性表之链表结构
java比较易懂,这里使用java语言package my.algorithm;public class arrayLinkedList { //一个数组存下个指针,一个数组存储元素的值。 private static int[] next = new int[100]; private static int[] data = new int[100]; //添加链表节点 public static void add(int ins,int p,int val){原创 2022-01-01 15:11:59 · 246 阅读 · 0 评论 -
完美数(正因子和等于值本身)
思想是:通过计算ii小于num数值的小因子,来计算另一个因子,当ii=0时,不再加上互补的大因子代码如下:class Solution { public boolean checkPerfectNumber(int num) { //1没有小于自身的正因子,是边界条件,予以返回。 if (num == 1) { return false; } //初始正因子必有1,所以算上 int sum =原创 2022-01-01 00:07:02 · 478 阅读 · 0 评论 -
一道2022北航的考研算法题(非递归)
后序遍历的实现 使用非递归算法:1.后序遍历的顺序是左右根。2.使用栈来输出到数组中即是根右左3.在入栈时,应当先放根,再放右节点,当节点无右节点或栈内上一个元素为右节点时,输出左节点到数组中。class Solution { public List<Integer> postorderTraversal(TreeNode root) { //返回答案的数组 ArrayList<Integer> arrayList = new Array原创 2021-12-31 13:42:20 · 227 阅读 · 0 评论