
Algorithm
JJunQw
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
435无重叠区间
文章目录贪心算法435 无重叠区间方法1 暴力解法2 动态规划贪心算法什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高。暴力解法需要指数级时间,因为需要处理很多重复计算过程动态优化(带备忘录的暴力解法),可以避免计算重复子问题,将复杂度降为 多项式级别 O(nlogn)贪心算法,如果满足贪心...原创 2020-08-05 19:35:34 · 318 阅读 · 0 评论 -
股票类型题
dp[n][0/1]表示第n持有和不持有的利益,每天都有两个状态;转移方程1.今天不持有 可能是 今天刚卖出 或者 之前就不持有(保持状态)dp[i][0] = max(dp[i-1][1]+prices[i],dp[i-1][0]);2.今天持有股票 可能是 保持之前持有的状态 或者 今天刚买入 ,因为只能交易一次,所以今天买入直接去-prices[i]即可dp[i][1]...原创 2020-04-11 19:49:05 · 248 阅读 · 0 评论 -
322. 零钱兑换
思路回溯 超时做这种题,一般先画出递归树,辅助我们理解过程,可以看到分支中存在很多重复计算,为我们优化提供了方向;void dfs(vector<int>& coins, int amount,int& res,int ans){ if(amount == 0){ res = min(res,ans); ...原创 2020-04-11 15:27:40 · 169 阅读 · 0 评论 -
leetcode 数字翻译字符串 多方法解析
很明显可以看出来,解空间为一个多叉树,我们先画一下状态树,辅助理解:从这个状态树中,我们就很容易看出来这其实就是 多叉树的回溯搜索,如果当前节点>=10 <=25,则继续向下搜索,否则回溯到上一个节点;大于10是因为 可能存在0元素,如506, 只能是 5-->06 而不能组成 5->0->6DFSclass Solution {public: ...原创 2020-04-06 21:46:58 · 419 阅读 · 0 评论 -
0-1背包问题全解析
0-1背包问题给定n个重量为w1/w2/w3.../wn,价值为v1/v2/v3.../vn的物品,容量为C的背包,求这个背包可以装下的价值最高的子集,每个物品只能使用一次w = {2,1,3,2} //重量v = {12,10,20,15} // 价值C = 5 // 容量#最佳子集为 [2,1,2] 12+10+15 = 37暴力递归对每个物品,都有选择/不选...原创 2020-04-06 01:24:46 · 808 阅读 · 0 评论 -
leetcode.864 获取所有钥匙的最短路径
864. 获取所有钥匙的最短路径给定一个二维网格 grid。"."代表一个空房间, "#"代表一堵墙, "@"是起点,("a", "b", ...)代表钥匙,("A", "B", ...)代表锁。我们从起点开始出发,一次移动是指向四个基本方向之一行走一个单位空间。我们不能在网格外面行走,也无法穿过一堵墙。如果途经一个钥匙,我们就把它捡起来。除非我们手里有对应的钥匙,否则无法通过锁。假设 K ...原创 2020-04-04 20:45:02 · 640 阅读 · 0 评论 -
leetcode 接雨水I II
双指针根据木桶原理,储水量由最短边决定我们使用两个指针,分别向左向右扫描,保存左右边的最高高度如果height[l] < height[r] 即右边高度高,则储水量由左边高度确定,反之相反class Solution {public: int trap(vector<int>& height) { int lmax=0,rmax=0...原创 2020-03-26 21:36:50 · 189 阅读 · 0 评论 -
33. 搜索旋转排序数组
33. 搜索旋转排序数组二分法将数组一分为二,则一定有 一部分是有序的,一部分是无序的 4 5 6 7 0 1 2如果nums[r] > nums[mid] 则右边一定有序 0 1 2 (7_mid 0 1 2_r)如果 nums[l] < nums[mid] 则左边一定有序 4 5 6 7 4_l 5 6 7 0_mid对有序部分的首尾元素进行判断,...原创 2020-03-19 15:11:26 · 121 阅读 · 0 评论 -
LeetCode_String
文章目录541 翻转字符串II557 翻转字符串中的单词 III383. 赎金信14. 最长公共前缀17. 电话号码的字母组合二进制手表541 翻转字符串II给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。...原创 2020-03-09 17:19:06 · 236 阅读 · 0 评论 -
拓扑排序
应用拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列。有向无环图(DAG)拓扑排序是基于有向无环图而言的Directed Acyclic Graph,如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个...原创 2020-03-07 13:46:27 · 150 阅读 · 0 评论 -
并查集相关问题
文章目录128. 最长连续序列1319. 连通网络的操作次数128. 最长连续序列// hard给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。要求复杂度O(N), 一般就是使用空间换时间,可以考虑使用 h...原创 2020-03-06 17:38:24 · 294 阅读 · 0 评论 -
c++ 并查集实现 优化
定义并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询两种操作的一种数据结构并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。并查集有两个基本操作:Find: 查找元素所属子集Union:合并两个子集为一个新的集合并查集的基本结构我们可以使用树这种数据结构来表示集合,不...原创 2020-03-05 01:34:26 · 647 阅读 · 0 评论 -
子集、全排列、组合 问题模式 回溯类型题解
文章目录78. 子集90 子集II77 组合46 全排列47 全排列II39 组合总和40 组合总和II78. 子集给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。输入: nums = [1,2,3]输出: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]子集: 对每个元素都有 取与不取...原创 2020-03-04 14:27:53 · 248 阅读 · 0 评论 -
c++ 堆排序
堆排序堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。图解堆排序堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行...原创 2020-03-01 17:50:00 · 1786 阅读 · 0 评论 -
c++ 插入、希尔排序
插入排序插入排序的核心思想是 构建有序序列, 对于未排序数据,在已排序序列中 从后向前扫描,找到对应的位置并插入,这样慢慢 构建有序序列;交换法移动法代码实现: 选取首元素为有序序列,取有序序列后一个元素作为 插入对象, 在 有序序列中 从后向前 扫描, 找到对应的 插入位置// 在插入时采用交换法 (对比的同时 进行交换)// 1 4 5 3 --> 1 4 3 ...原创 2020-03-01 17:16:33 · 175 阅读 · 0 评论 -
快速排序 归并排序
思想通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。partition函数分割函数,快排的核心,思想就是在数组中找一个数作为中间值,把数组中比它小的放左边,大的放右边。这个函数有两种写法,单指针版和双指针版。核心思想: 每次都取数组的第一个元素作为比较标准(哨兵元素),凡是大于这个哨...原创 2020-03-01 14:44:09 · 206 阅读 · 0 评论 -
递归案例
文章目录24. 两两交换链表中的节点104. 二叉树的最大深度110. 平衡二叉树101. 对称二叉树226. 翻转二叉树617. 合并二叉树83. 删除排序链表中的重复元素24. 两两交换链表中的节点给定 1->2->3->4, 你应该返回 2->1->4->3.递归解法主要就是递归的三部曲:找终止条件:本题终止条件很明显,当递归到链表为空或者...原创 2020-02-29 14:05:12 · 483 阅读 · 0 评论 -
二分法-牛顿法-求sqrt
title: 二分法 牛顿法 求sqrtcomments: truecategories:Algorithmtags:AlgorithmC++date: 2019-03-21 10:47:38使用二分法首先确定二分法查找的首尾区间,然后根据abs(mid^2-target)<eps的误差进行区间的移动,寻找满足精度的位置存在的问题:第一步寻找合适的搜索区间...原创 2019-12-13 19:33:41 · 546 阅读 · 0 评论 -
931. 下降路径最小和_DP
int minFallingPathSum2(vector<vector<int>>& A) { int row = A.size(); if(row == 0) return 0; if(row == 1) return A[0][0]; int col = A[0].size(); vector<vector<...原创 2019-12-06 15:27:33 · 142 阅读 · 0 评论 -
最小 最长 max_min系列 DP
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。使用二维数组的...原创 2019-12-06 10:52:49 · 246 阅读 · 0 评论 -
128. 最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。时间复杂度为O(n),则只能用空间复杂度去换取,可以使用hash表去 找左右值是否存在class Solution {public: int longestConsecu...原创 2019-12-05 20:47:23 · 129 阅读 · 0 评论 -
62. 不同路径_备忘录递归_DP
使用 dp[i][j] 存储走到i,j时 总可能的路径数因为只可以向下向右走,则任意点的路径数为dp[i][j] = dp[i-1][j] + dp[i][j-1];dp初始化最上面一排和最左面一排,因为只可以向右走和向下走,所以初始化路径数都为1,其它为0class Solution {public: int uniquePaths(int m, int n) { ...原创 2019-11-17 22:54:25 · 182 阅读 · 0 评论 -
动态规划
思路1直接使用一个三维度的dp数组[m][k][j], 保存第m天,操作k次,是否持有股票的最大利润,然后找最大的max(dp[m-1][0][0],dp[m-1][1][0],dp[m-1][2][0]);思路2dp1[i] = max(dp[i-1], prices[i] - minval) 从前往后遍历,表示第1天到第i天之间的最大利润(通过是否在第i天卖出确认);dp2[i] =...原创 2019-11-15 17:40:36 · 203 阅读 · 0 评论 -
BFS_DFS
给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。示例 1:输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4输出: True说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。1 <= k <= len(nums) <= 160 < num...原创 2019-11-12 20:48:04 · 279 阅读 · 0 评论 -
二叉树递归
文章目录113 路径总和 II129. 求根到叶子节点数字之和124. 二叉树中的最大路径和404- 左叶子之和(easy)513. 找树左下角的值()113 路径总和 IIclass Solution {public: vector<vector<int>> pathSum(TreeNode* root, int sum) { ...原创 2019-10-16 23:14:29 · 420 阅读 · 0 评论 -
优先队列和sort 的排序
Sort默认使用less排序,从小到大排序,可以自定义排序方法less() //从小到大排序 <grater() //从大到小排序 >less_equal() // <=gtater_equal()// >=>从大到小排序 <从小到大排序static bool cmp2(int a,int b){ return a &...原创 2019-10-12 18:07:13 · 513 阅读 · 0 评论 -
347-前 K 个高频元素
// 利用i 这个trick,记录了最大出现的频率值,然后逐渐减少i, 直到找到第二小的频率值, 但是这个方法适用于频率值差异比较小的情况,如果频率值差异很大, 那么会无用的遍历map很多遍,而找不到对应的频率值class Solution {public: vector<int> topKFrequent(vector<int>& nums, int ...原创 2019-10-11 20:17:32 · 464 阅读 · 1 评论 -
279-完全平方数
279-完全平方数#include <iostream>#include <vector>#include <queue>using namespace std;class Solution {public: int numSquares(int n) { int res = 0; if(n <= ...原创 2019-10-11 19:43:29 · 195 阅读 · 0 评论 -
算法随笔2
文章目录242. Valid Anagram49. Group Anagrams (字母异位词分组)242. Valid AnagramGiven two strings s and t , write a function to determine if t is an anagram of s.Input: s = "anagram", t = "nagaram"Output: tr...原创 2019-08-29 19:43:18 · 387 阅读 · 0 评论 -
61. Rotate List
Input: 0->1->2->NULL, k = 4Output: 2->0->1->NULLExplanation:rotate 1 steps to the right: 2->0->1->NULLrotate 2 steps to the right: 1->2->0->NULLrotate 3 step...原创 2019-06-18 00:28:50 · 131 阅读 · 0 评论 -
19. Remove Nth Node From End of List
去掉列表中 倒数第n个节点#include <vector>#include <iostream>using namespace std;struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 1.递归算法...原创 2019-06-17 22:08:44 · 176 阅读 · 0 评论 -
24. Swap Nodes in Pairs
成对交换列表节点给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。给定 1->2->3->4, 你应该返回 2->1->4->3. struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; // ...原创 2019-06-17 21:09:43 · 122 阅读 · 0 评论 -
算法随笔
文章目录原地删除重复的数字数组中出现次数超过一半的元素解法1解法2将数值向右移动K个位置(非负数)解法1解法2判断重复数字变形2找出只出现一次的元素解法1解法2求数组的交集解法1排序数组,找交集Plus One 加1移动所有的0到末尾反转字符串字母异位词回文字符串查找字符串数组最长前缀合并两个有序链表合并有序数组数组最大子序和解法1解法2何时买卖股票_121完成一次交易可以完成多次交易Pascal...原创 2019-06-16 15:50:54 · 894 阅读 · 0 评论 -
List_算法
文章目录141. Linked List Cycle203. Remove Linked List Elements142. Linked List Cycle II141. Linked List Cycle判断list是否存在环结构,利用快慢指针即可,快指针每次走两步,慢指针每次走一步 bool hasCycle(ListNode *head) { if(!he...原创 2019-06-20 00:09:26 · 454 阅读 · 0 评论