算法
~kiss~
这个作者很懒,什么都没留下…
展开
-
leetcode-17. 电话号码的字母组合
leetcode-17. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例 1:输入:digits = “23”输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]思路:不断把前面的元素拿出来追加,然后再删除之前的元素class Solution {public: vector<vector<s原创 2022-02-22 00:00:27 · 139 阅读 · 0 评论 -
leetcode-1171-从链表中删除局部和为0的连续节点
原创 2022-02-21 23:07:42 · 211 阅读 · 0 评论 -
KMP-字符串的模式匹配
原创 2022-02-21 22:50:11 · 124 阅读 · 0 评论 -
leetcode-220. 存在重复元素-红黑树-桶的运用
给一个整数数组 nums 和两个整数 k 和 t 。请判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。红黑树-set很容易实现范围查找1 set的lower_bound()的运用2 在set中取出符合左边条件的最小值,然后判断它是否满足右边条件的最大值范围3 对超出范围的元素要及时清理哈希桶class Solution原创 2022-02-21 22:25:46 · 703 阅读 · 0 评论 -
并查集学习
并查集学习博客:https://zhuanlan.zhihu.com/p/93647900/解决元素分组问题。并查集管理一系列不相交的集合,支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。查询(Find):查询两个元素是否在同一个集合中。亲戚问题举例题目背景若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。题目描述规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的原创 2022-02-20 23:44:52 · 66 阅读 · 0 评论 -
leetcode-200. 岛屿数量-并查集
leetcode-200. 岛屿数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。并查集(Union-find Data Structure)是一种树型的数据结构。它的特点是由子结点找到父亲结点,用于处理一些不交集(Disjoint Sets)的合并及查询问题。Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。原创 2022-02-20 18:05:49 · 359 阅读 · 0 评论 -
leetcode130. 被围绕的区域
给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。正面dfs遍历struct SimplePairHash { std::size_t operator()(const std::pair<int, int>& p) const { return ((p.first) << 16) | p.second; }};class S原创 2022-02-20 16:08:23 · 797 阅读 · 0 评论 -
leetcode-2096. 从二叉树一个节点到另一个节点每一步的方向
给你一棵 二叉树 的根节点 root ,这棵二叉树总共有 n 个节点。每个节点的值为 1 到 n 中的一个整数,且互不相同。给你一个整数 startValue ,表示起点节点 s 的值,和另一个不同的整数 destValue ,表示终点节点 t 的值。请找到从节点 s 到节点 t 的 最短路径 ,并以字符串的形式返回每一步的方向。每一步用 大写 字母 ‘L’ ,‘R’ 和 ‘U’ 分别表示一种方向:‘L’ 表示从一个节点前往它的 左孩子 节点。‘R’ 表示从一个节点前往它的 右孩子 节点。‘U’ 表原创 2022-02-19 18:52:44 · 415 阅读 · 0 评论 -
leetcode-236. 二叉树的最近公共祖先
leetcode-236. 二叉树的最近公共祖先deque法class Solution {public: deque<TreeNode*> dqp; deque<TreeNode*> dqq; bool findNode(TreeNode* root, deque<TreeNode*>& dq, TreeNode* target) { dq.push_back(root); if(root == target) { return原创 2022-02-19 15:45:08 · 438 阅读 · 0 评论 -
删除链表的倒数第k个节点
class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(!head || n<=0) return head; ListNode* fast = head; // fast 落在 NULL 上 ListNode* slow = head; // slow 落在被删除的前一个上面 // 倒 1 的话 fast原创 2022-02-18 23:18:57 · 190 阅读 · 0 评论 -
leetcode-654. 最大二叉树
leetcode-654. 最大二叉树给定一个不重复的整数数组 nums 。最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。class Solution {public: TreeNode* constructMaximumBinaryTreeHelper(vector<int>& nums, int start, i原创 2022-02-13 11:17:45 · 257 阅读 · 0 评论 -
归并排序-分治思想
归并排序-分治思想递归做法#include <iostream>#include <vector>using namespace std;void mergeSortHelper(vector<int> &v, int start, int mid, int end, vector<int> &tmp) { int i = start; int j = mid + 1; int k = start; while(i <原创 2022-02-13 09:59:48 · 398 阅读 · 0 评论 -
期望为线性的选择算法
以快排为模型,对数组递归划分,但递归后只处理包含所查第k个元素的那边,如此递归下去直至查找成功#include <stdio.h>int Randomized_partition(int * a, int p, int r){ int x = a[r]; int i, j; i = p - 1; int temp; for(j = p; j < r; j++) { if(a[j] <= x) { i+=1; temp = a[i]; a[i原创 2022-02-12 18:41:52 · 561 阅读 · 0 评论 -
leetcode-215. 数组中的第K个最大元素
leetcode-215. 数组中的第K个最大元素给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5大顶堆class Solution {public: void heapSortHelper(vector<int>& nums, int start, int len) { int child =原创 2022-02-12 18:24:30 · 739 阅读 · 0 评论 -
leetcode-1461. 检查一个字符串是否包含所有长度为 K 的二进制子串
leetcode-1461. 检查一个字符串是否包含所有长度为 K 的二进制子串给你一个二进制字符串 s 和一个整数 k 。如果所有长度为 k 的二进制字符串都是 s 的子串,请返回 true ,否则请返回 false 。示例 1:输入:s = “00110110”, k = 2输出:true解释:长度为 2 的二进制串包括 “00”,“01”,“10” 和 “11”。它们分别是 s 中下标为 0,1,3,2 开始的长度为 2 的子串。本人最笨的办法class Solution {pub原创 2022-02-12 15:29:32 · 549 阅读 · 0 评论 -
leetcode-718. 最长重复子数组
leetcode-718. 最长重复子数组给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。动态规划class Solution {public: int findLength(vector<int>& A, vector<int>& B) { int lenA = A.原创 2022-02-12 11:59:15 · 884 阅读 · 0 评论 -
leetcode-207. 课程表
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。示例 1:输入:numC原创 2022-01-26 00:29:54 · 87 阅读 · 0 评论 -
剑指 Offer II 092. 翻转字符
如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是 单调递增 的。我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 s,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。返回使 s 单调递增 的最小翻转次数。示例 1:输入:s = “00110”输出:1解释:我们翻转最后一位得到 00111.dpclass Solution {public: int原创 2022-01-23 22:38:10 · 218 阅读 · 0 评论 -
剑指 Offer II 091. 粉刷房子
假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。例如costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。请计算出粉刷完所有房子最少的花费成本。示例 1原创 2022-01-23 21:49:01 · 206 阅读 · 0 评论 -
面试题 01.05. 一次编辑
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。示例 1:输入:first = “pale”second = “ple”输出: True// 编辑距离的方法class Solution {public: bool oneEditAway(string first, string second) { int len1 = first.length(); int len2 = second.l原创 2022-01-23 21:23:01 · 228 阅读 · 0 评论 -
面试题 01.08. 零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零class Solution {public: void setZeroes(vector<vector<int>>& matrix) { unordered_set<int> zero_row; unordered_set<int> zero_col; unordered_set<int>::iterator it_row; unordered原创 2022-01-23 21:20:35 · 167 阅读 · 0 评论 -
面试题 01.02. 判定是否互为字符重排
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。示例 1:输入: s1 = “abc”, s2 = “bca”输出: true// 一个往字典中不断加// 一个往字典中不断减class Solution {public: bool CheckPermutation(string s1, string s2) { int len1 = s1.length(); int len2 = s2.length();原创 2022-01-23 21:19:48 · 225 阅读 · 0 评论 -
剑指 Offer II 079. 所有子集
给定一个整数数组 nums ,数组中的元素 互不相同。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]这种应该不用去重// 回溯法class Solution {public: vector<vector<int>> res; void subsetsHelper(vector<i原创 2022-01-23 11:18:54 · 331 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]方法一:分组异或如果我们可以把所有数字分成两组,使得:两个只出现一次的数字在不同的组中;相同的数字会被分到相同的组中。那么对两个组分别进行异或操作,即可得到答案的两个数字。先对所有数字进行一次异或,得到两个出现一次的数字的异或值。在异或结果中找到任意为 1 的位。原创 2022-01-23 00:06:22 · 66 阅读 · 0 评论 -
剑指 Offer II 023. 两个链表的第一个重合节点
给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3u1WK4著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。如果两个链表相交,则公共部分长度肯定相等,假设为c, 那么链表A在公共部分前的长度是a-c,原创 2022-01-22 22:18:00 · 305 阅读 · 0 评论 -
剑指 Offer II 026. 重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0 → L1 → … → Ln-1 → Ln请将其重新排列后变为:L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。// 递归做法class Solution {public: ListNode* left; int left_index = 0; int right_index = 0; // 输入 1->(2) 2->(3)原创 2022-01-22 21:58:51 · 195 阅读 · 0 评论 -
剑指 Offer II 025. 链表中的两数相加
给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。可以假设除了数字 0 之外,这两个数字都不会以零开头。不可以对原链表进行破坏class Solution {public: // 对齐的情况下递归计算两链表的和 int reverseCalculateSum(ListNode* l1, ListNode* l2, ListNode **new_head) { if(!l1) return 0;原创 2022-01-22 20:05:59 · 77 阅读 · 0 评论 -
单链表学习-反转
#include <iostream>using namespace std;class LinkedList{public: int val; LinkedList *next; LinkedList(int _val): val(_val), next(NULL){}};// 递归逆序打印单链表void rtraverse(LinkedList *head) { if(!head) return; rtraverse(head->next); cout原创 2022-01-20 00:15:30 · 431 阅读 · 0 评论 -
单链表的递归-判断回文单链表
#include <iostream>using namespace std;class LinkedList{public: int val; LinkedList *next; LinkedList(int _val): val(_val), next(NULL){}};// 递归逆序打印单链表void rtraverse(LinkedList *head) { if(!head) return; rtraverse(head->next); cout原创 2022-01-20 00:14:22 · 280 阅读 · 0 评论 -
剑指 Offer II 030. 插入、删除和随机访问都是 O(1) 的容器
参考:https://leetcode-cn.com/problems/FortPu/solution/cpython3java-wu-xu-zi-dian-dong-tai-shu-jkxnx/设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构:insert(val):当元素 val 不存在时返回 true ,并向集合中插入该项,否则返回 false 。remove(val):当元素 val 存在时返回 true ,并从集合中移除该项,否则返回 false 。getRandom:原创 2022-01-19 00:04:43 · 64 阅读 · 0 评论 -
剑指 Offer II 029. 排序的循环链表
给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环升序的。给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。如果列表为空(给定的节点是 null),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。class Solution {public: Node* insert(Node* hea原创 2022-01-18 23:57:28 · 232 阅读 · 0 评论 -
leetcode-50. Pow(x, n)
O(logn)的时间复杂度x^n = x^(b(k)b(k-1)...b(2)b(1)b(0)) (b(k)的计算通过对n的某位判断是否为1得到,只取0或1) 将n用二进制展开 = x^(b(0)*2^0 + b(1)*2^1 + b(2)*2^2 + ... + b(k)*2^k) = x^(b(0)*2^0) * x^(b(1)*2^1) * ... * x^(b(k)*2^k)、对于x^(b(i)*2^i)的计算当 b(i) = 0 时,x^(b(i)*2^i) = 1当 b(i)原创 2022-01-16 14:52:41 · 180 阅读 · 0 评论 -
leetcode-16. 最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。示例 1:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。排序+双指针+去重class Solution {public: int threeSumClosest(vector<int原创 2022-01-16 14:51:40 · 166 阅读 · 0 评论 -
剑指 Offer II 015. 字符串中的所有变位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 变位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。变位词 指字母相同,但排列不同的字符串。示例 1:输入: s = “cbaebabacd”, p = “abc”输出: [0,6]解释:起始索引等于 0 的子串是 “cba”, 它是 “abc” 的变位词。起始索引等于 6 的子串是 “bac”, 它是 “abc” 的变位词。暴力解法class Solution {public: vector<int>原创 2022-01-16 14:48:43 · 160 阅读 · 0 评论 -
leetcode-48. 旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。class Solution {public: void rotate(vector<vector<int>>& matrix) { int len = matrix.size(); int cycle = len/2; for(int i = 0; i <原创 2022-01-15 16:36:11 · 94 阅读 · 0 评论 -
leetcode-18. 四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0 <= a, b, c, d < na、b、c 和 d 互不相同nums[a] + nums[b] + nums[c] + nums[d] == target你可以按 任意顺序 返回答案 。示例 1:输入:nums = [1,0,-1,原创 2022-01-15 16:00:18 · 135 阅读 · 0 评论 -
剑指 Offer II 010. 和为 k 的子数组
给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。class Solution {public: int subarraySum(vector<int>& nums, int k) { unordered_map<int,int> imap; int cursum = 0; int result = 0; imap[0] = 1; for(int i = 0原创 2022-01-15 12:43:45 · 111 阅读 · 0 评论 -
剑指 Offer II 013. 二维子矩阵的和
给定一个二维矩阵 matrix,以下类型的多个请求:计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)掌握一维前缀和和二维前缀和进而能掌握一维前缀积和二维前缀积class NumMatrix {private: vector<vector<int>> sums; // 一维前缀和public: // 行的一维前缀 NumMatrix(vector<vector<int>>&a原创 2022-01-15 12:01:34 · 199 阅读 · 0 评论 -
剑指 Offer II 009. 乘积小于 K 的子数组
剑指 Offer II 009. 乘积小于 K 的子数组给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 k 的连续的子数组的个数。示例 1:输入: nums = [10,5,2,6], k = 100输出: 8解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。需要注意的是 [10,5,2] 并不是乘积小于100的子数组。class Solution {public:原创 2022-01-15 00:32:37 · 95 阅读 · 0 评论 -
剑指 Offer II 007 数组中和为 0 的三个数
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]class Solution {public: vector<vector<int>> threeSum(vector<int>原创 2022-01-14 00:07:38 · 87 阅读 · 0 评论