数据结构与算法
文章平均质量分 53
数据结构与算法,个人leetcode刷题之旅
豆子前端
技术现学现卖,公众号同名
展开
-
[算法题]田忌赛马(全排列简易解法)
[算法题]田忌赛马(全排列简易解法)原创 2024-06-27 18:15:46 · 293 阅读 · 0 评论 -
[数据结构与算法]动态规划:扔鸡蛋问题
[数据结构与算法]动态规划:扔鸡蛋问题原创 2022-12-05 21:16:22 · 236 阅读 · 0 评论 -
[leetcode]回溯框架TypeScript版本
TypeScript | JavaScript | 回溯框架原创 2022-05-16 15:43:11 · 247 阅读 · 0 评论 -
[Leetcode](Ts语言)会议室问题
[Leetcode](Ts语言)会议室问题原创 2022-04-22 17:22:22 · 495 阅读 · 0 评论 -
(Typescript)[leetcode]1011. Capacity To Ship Packages Within D Days
(Typescript)[leetcode]1011. Capacity To Ship Packages Within D Days思想:二分法模板,抽象出单调函数,寻最值function binarySearch(nums: number[], target: number) { let left = 0, right = nums.length - 1; while (left <= right) { let mid = left + Math.floor(原创 2022-04-15 11:23:25 · 487 阅读 · 0 评论 -
[leetcode]团灭股票买卖问题(js做法)
Javascript买卖股票的最佳时机买卖股票的最佳时机 II买卖股票的最佳时机 III买卖股票的最佳时机 IV最佳买卖股票时机含冷冻期买卖股票的最佳时机含手续费第一题买卖股票的最佳时机,相当于k=1的情形。var maxProfit = function (prices) { let n = prices.length; if (n <= 1) { return 0; } let dp = new Array(n); dp.原创 2021-01-05 18:54:59 · 155 阅读 · 0 评论 -
用java刷算法题,怎么能不知道java.util的这些数据结构?
文章目录顶层抽象类java.util.Collectionjava.util.IteratorJava库中具体集合Listjava.util.Listjava.util.ListIterator(重点)java.util.ArrayList(重点)java.util.LinkedListSetjava.util.LinkedHashSet队列java.util.Queue(接口)(重点)java.util.Dequejava.util.ProrityQueueMap接口java.util.Map更详细的图原创 2020-12-05 20:35:31 · 559 阅读 · 0 评论 -
面试官:小伙子,洗牌算法怎么实现呀
文章目录完整代码如何判断洗牌算法是否正确误区完整代码package com.classicalAlgorithm.shuffle;import java.util.Arrays;import java.util.HashMap;import java.util.Random;public class Solution { // 得到一个在闭区间 [min, max] 内的随机整数 private int randInt(int min, int max) {原创 2020-12-05 15:40:30 · 201 阅读 · 0 评论 -
java中生成PriorityQueue大顶堆的方法
java中调用优先级队列如下,但默认生成的是小顶堆,即堆顶是最小的。// 小顶堆PriorityQueue<Integer> pq = new PriorityQueue<>();生成大顶堆的方法PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, In原创 2020-12-05 14:07:02 · 1550 阅读 · 0 评论 -
[数据结构]优先级队列(最大堆)详解
文章目录基本性质存储方式具体实现向上调整swim向下调整sink实现delMax (删除队顶元素)实现insert完整代码建堆自顶向下建堆自底向上建堆堆排序例题寻找第K大元素基本性质优先级队列,也叫二叉堆、堆(不要和内存中的堆区搞混了,不是一个东西,一个是内存区域,一个是数据结构)。堆的本质上是一种完全二叉树,分为:最小堆(小根堆):树中每个非叶子结点都不大于其左右孩子结点的值,也就是根节点最小的堆,图(a)。最大堆(大根堆):树中每个非叶子结点都不小于其左右孩子结点的值,也就是根节点最大的堆,原创 2020-12-05 00:41:04 · 1790 阅读 · 0 评论 -
[leetcode]678. 有效的括号字符串(双栈写法)
文章目录双向遍历双栈题目传输:678. 有效的括号字符串双向遍历极端假设替换为全左或全右,双向遍历验证假设所有 '’ 都为 ‘(’因左括号必须在配对的左边,故从左向右遍历,看是否足够覆盖所有 ‘)’假设所有 ‘*’ 都为 ‘)’因右括号必须在配对的右边,故从右向左遍历,看是否足够覆盖所有 ‘(’public boolean checkValidString(String s) { // all * for (, valid enough or not int l = 0原创 2020-09-28 19:02:30 · 224 阅读 · 0 评论 -
js中常见的几种深拷贝方法
文章目录使用递归方式进行深拷贝使用slice、concat方法通过JSON序列化实现深拷贝object.assign()实现深拷贝lodash函数库实现深拷贝使用jq(extend)方法实现深拷贝参考资料使用递归方式进行深拷贝let deepClone = (initalObj) => { const obj = {}; if(typeof initalObj !== 'object'){ return initalObj } for (const ke原创 2020-09-10 22:50:01 · 2744 阅读 · 0 评论 -
[leetcode]1140.捡石头(动态规划做法)
文章目录题目动态规划定义dp数组意义找出状态转移方程base case代码其它做法结语参考资料题目动态规划动态规划三步走定义dp数组意义找出状态转移方程明确基本情况定义dp数组意义dp[i][j]表示M = i的情况下,剩余piles[j : len - 1]堆时,先取的人能获得的最多石子数行为i 列为j 因为行多了一行j为0的情况 这里先不考虑优化数组空间,重在思路找出状态转移方程一、 len - i <= 2M 剩下的堆数能够直接全部取走,那么最优的情况就原创 2020-09-10 21:14:21 · 828 阅读 · 0 评论 -
[剑指offer]no.37 序列化与反序列二叉树
文章目录题目思路序列化反序列化代码题目剑指 Offer 37. 序列化二叉树思路序列化很简单,就是二叉树的层级遍历,直接用队列。这里不多说了。反序列化特例处理: 若 data 为空,直接返回 null ;初始化: 序列化列表 vals (先去掉首尾"[]",用逗号分割)指针 i = 1 ,根节点 root (值为 vals[0] ),队列 nodeQue;nodeQue中放入root结点按层构建: 当 nodeQue为空时跳出;节点出队,记为tmpNod原创 2020-09-10 18:02:37 · 100 阅读 · 0 评论 -
[leetcode]15.三数之和(双指针做法)
文章目录题目思路排序双指针法复杂度代码题目题目传送门: 15. 三数之和思路排序先将给定 nums 排序,复杂度为 N*log(2,N)。双指针法固定 3 个指针中最左(最小)数字的指针left,双指针 mid,right 分设在数组索引两端sum = nums[left] + nums[mid] + nums[right]双指针交替向中间移动,记录对于每个固定指针left 的所有满足 sum == 0 组合当 nums[left] > 0 时,直接brea原创 2020-09-10 16:40:23 · 193 阅读 · 0 评论 -
[十大排序算法]快速排序及其优化
文章目录十大排序算法快速排序描述实现示例注意点算法评估优化优化1优化2优化3优化4两路快排三路快排参考资料十大排序算法排序算法时间复杂度(最坏)时间复杂度(最好)空间复杂度排序方式稳定性插入排序n^2n1in稳定冒泡排序n^2n1in稳定选择排序n^2n^21in不稳定快速排序n^2nlog(2, n)log(2, n)in不稳定归并排序nlog(2, n)nlog(2, n)nout稳定希原创 2020-09-10 14:54:02 · 350 阅读 · 0 评论 -
[十大排序算法]选择排序及其优化
文章目录十大排序算法选择排序描述实现优化优化方向1参考资料十大排序算法排序算法时间复杂度(最坏)时间复杂度(最好)空间复杂度排序方式稳定性插入排序n^2n1in稳定冒泡排序n^2n1in稳定选择排序n^2n^21in不稳定快速排序n^2nlog(2, n)log(2, n)in不稳定归并排序nlog(2, n)nlog(2, n)nout稳定希尔排序n^2n1in不稳定堆排序原创 2020-09-10 09:51:24 · 208 阅读 · 0 评论 -
[十大排序算法]冒泡排序及其优化
文章目录十大排序算法冒泡排序描述实现优化优化方向一优化方向二参考资料十大排序算法排序算法时间复杂度(最坏)时间复杂度(最好)空间复杂度排序方式稳定性插入排序n^2n1in稳定冒泡排序n^2n1in稳定选择排序n^2n^21in不稳定快速排序n^2nlog(2, n)log(2, n)in不稳定归并排序nlog(2, n)nlog(2, n)nout稳定希尔排序n^2n1in不稳定原创 2020-09-09 22:24:53 · 219 阅读 · 0 评论 -
由斐波那契数列谈到递归、备忘录、动态规划、生成器
斐波那契数列F(1)=1F(2)=1F(n)=F(n - 1)+F(n - 2)版本一 暴力递归可以看做是一个树自顶向下n的值就等于树的高度时间复杂度O(n^2)def fib1(n): if n == 1 or n == 2: return 1 return fib1(n - 1) + fib1(n - 2)版本二 暴力递归+备忘录一般使用一个数组充当这个「备忘录」,当然也可以使用哈希表(字典),思想都是一样的。备忘录就是为了避原创 2020-09-04 20:00:35 · 385 阅读 · 0 评论 -
[leetcode]39. 组合总和(回溯做法)
文章目录题目思路代码回溯做法动态规划结语题目39. 组合总和思路套模板,回溯法def backtrack(选择列表,路径): if 满足结束条件: 操作res return for 选择 in 选择列表: if 选择不合法 # 剪枝 continue # 做选择 进入下一层决策树 选择列表.remove(选择)原创 2020-09-04 18:30:02 · 266 阅读 · 0 评论 -
[leetcode]257.二叉树的所有路径(回溯做法)
文章目录题目思路代码题目257. 二叉树的所有路径思路不多说了,回溯先套模板,然后改动一下。回溯真的牛逼,笔试中常用做法,可以搭配备忘录等剪枝优化。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } *原创 2020-09-04 03:44:33 · 367 阅读 · 0 评论 -
(leetcode)no.46 全排列(回溯做法)
文章目录题目思路代码结语参考资料题目思路这里我主要讲的是回溯法的做法。回溯主要是基于递归的思想,一定要记得,在递归结束后,要撤销选择。在递归之前做出选择,在递归之后撤销刚才的选择,就能正确得到每个节点的选择列表和路径。大体框架如下:def backtrack(选择列表,路径): if 满足结束条件: 操作res return for 选择 in 选择列表: if 选择不合法 # 剪枝原创 2020-09-04 01:00:03 · 282 阅读 · 0 评论 -
(leetcode)no.590 N叉树的后序遍历(递归)
文章目录题目思路代码题目590. N叉树的后序遍历思路后序遍历嘛,无非是“左右根”。这里的N叉树,就是从左往右再到根。诶,不多说,直接上代码。代码import java.util.*;public class Solution { List<Integer> res = new ArrayList<>(); public List<Integer> postorder(Node root) { // 从root开始启动原创 2020-09-04 00:53:37 · 153 阅读 · 0 评论 -
(leetcode)no.322 零钱兑换(动态规划做法)
文章目录题目思路**1.确定`dp`函数(数组)的定义****2.确定「状态转移方程」****3.确定基本情况**4.大概思路代码暴力递归(自上而下)递归 + 备忘录(自上而下)**使用dp 数组迭代(自下而上)**题目题目传送:这里思路因为硬币的数量是没有限制的,子问题之间没有相互制,是互相独立的。具有「最优子结构」所以可以判断,这个问题是看作是动态规划问题。接下来就是动态规划三步走。1.确定dp函数(数组)的定义函数 dp(n)表示,当前的目标金额是n,至少需要dp(n)个硬币凑出该金原创 2020-09-03 20:25:22 · 373 阅读 · 0 评论 -
(leetcode)no.1312 让字符串成为回文串的最少插入次数(动态规划做法)
题目点击这里:传送思路(一)定义数组元素的含义dp[i][j] 表示s[i..j]中最长回文子序列的长度所以只有当i<=j时,dp数组中才有值。(二)找出关系数组元素间的关系式经过分析,可以分成三大类讨论1.str[i,j]只有一个字符,即i==j。即其本身可以形成回文,即dp[i][j]=02.str[i,j] 有两个字符2.1 当str[i]==str[j],即两个字符相同时,dp[i][j]=0。2.2 当str[i]!=str[j],即两个字符不同时,例如,AB原创 2020-09-01 22:50:56 · 468 阅读 · 0 评论 -
(Leetcode)no.62 不同路径(动态规划做法)
题目题目:这里思路(一)定义数组元素的含义定义 dp[i] [j]的含义为:当机器人从左上角走到(i, j) 这个位置时,一共有 dp[i] [j] 种路径。(二)找出关系数组元素间的关系式由于机器人可以向下走或者向右走,所以有两种方式到达。从 (i-1, j) 这个位置走一步到达。从(i, j - 1) 这个位置走一步到达。因为是计算所有可能的步骤,所以是把所有可能走的路径都加起来,所以关系式为:dp[i][j] = dp[i-1][j] + dp[i][j-1](三原创 2020-08-31 21:05:40 · 248 阅读 · 0 评论 -
剑指offer系列之青蛙上台阶(动态规划入门级)
前言阅读完本文,可以去leetcode把这题秒了。https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/submissions/问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路(1)定义数组元素的含义dp[i] 的含义为:跳上一个 i 级的台阶总共有 dp[i] 种跳法。(2)找出数组元素间的关系式所以青蛙到达第 n 级的台阶有两种方式一种是从第 n-1原创 2020-08-31 18:09:59 · 185 阅读 · 0 评论 -
LRU缓存机制之LRU算法
文章目录一、题目二、思路三、参考文章四、代码一、题目题目链接:https://leetcode-cn.com/problems/lru-cache/二、思路双向链表 + 哈希表哈希表负责快速查找,时间复杂度为O(1)双向链表负责快速插入和删除,时间复杂度为O(1)…(避免侵权)欲知后续详情如何,微信公众号搜labuladong,公众号里搜LRU十分详细!三、参考文章微信公众号搜:labuladong,公众号里搜LRU必须跟我东哥学,你懂的。东哥上天狂斩算法题,下地能给舍原创 2020-08-20 21:16:27 · 277 阅读 · 0 评论 -
(Leetcode) 31. Next Permutation
前言:萌新刷题ing…-------------------正文分割线-----------------------------lexicographically:字典序解:可以认为是一个串或数字的排序问题,即找出这个数组排序出的所有数中,刚好比当前数大的那个数。例如,输入“1,2,3” ,可以组成6个数,分别为123,132,213,231,312,321根据题目所得,输出的应...原创 2020-02-12 21:35:59 · 115 阅读 · 0 评论 -
(Leetcode) 24. Swap Nodes in Pairs
Swap Nodes in Pairs思路:①递归略②不递归用三个指针,pre、cur、next;pre:指向当前结点的前驱结点cur: 当前结点next:当前结点的next/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next;...原创 2020-02-11 19:42:30 · 104 阅读 · 0 评论