自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 股票交易问题全拿下,一扫光

上来直接最难的,后面都是毛毛雨。问题一:买卖股票的最佳时机IV(leetcode188)问题描述:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv著作权归领.

2020-06-11 20:11:34 407

原创 0/1背包与完全背包

背包问题描述:假设有一个固定容量的背包,然后有许多具有价值属性和重量属性的物品,要求在不超过背包最大容量的基础上装的物品的总价值最大。假设共有N个物品,背包的容量为M,物品 i 的价值与重量分别为 value[i] 和 weight[i]。dp[i][j] 为可选物品为一到i,背包空间为j时的最大价值。0/1背包0/1背包为最基础的背包问题,顾名思义,所有的物品只有一件,只有拿或不拿两种选择,dp[i][j]的表达式如下:最大价值为选i物品和不选i物品的最大值。实现代码如下:

2020-05-22 19:04:46 335

原创 科目一笔记

科目一笔记

2024-04-17 23:39:41 810

原创 单源最短路径问题

本篇只考虑无权图的最短路径。问题一:走迷宫问题方案一(dfs + 回溯):方案二(bfs):问题二:单词接龙(leetcode127)解法一(dfs + 回溯):解法二(bfs获得最短路径):问题一:走迷宫问题定义一个二维数组M*Nmaze它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点maze[0][0] = 0,出口点maze[M - 1][N - 1] = 0表示出口入口都是可以走的.

2020-06-23 16:43:35 1473

原创 避免洪水泛滥(leetcode1448)

问题描述:你的国家有无数个湖泊,所有湖泊一开始都是空的。当第 n个湖泊下雨的时候,如果第 n个湖泊是空的,那么它就会装满水,否则这个湖泊会发生洪水。你的目标是避免任意一个湖泊发生洪水。给你一个整数数组rains,其中:rains[i] > 0表示第 i天时,第 rains[i]个湖泊会下雨。rains[i] == 0表示第 i天没有湖泊会下雨,你可以选择 一个湖泊并 抽干这个湖泊的水。请返回一个数组ans,满足:ans.length == rains.le...

2020-06-22 16:02:01 807

原创 IP地址和子网掩码的分类统计

一道特别恶心的字符串处理题。问题描述:请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为A,B,C,D,E五类A类地址1.0.0.0~126.255.255.255;B类地址128.0.0.0~191.255.255.255;C类地址192.0.0.0~223.255.255.255;D类地址224.0.0.0~239.255.255.255;E类地址240.0.0.0~255.255.255.2.

2020-06-19 20:45:51 348

原创 二叉树路径和问题

问题一:二叉树中最大路径和(leetcode124)问题描述:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。大体思路:其最大路径和有以下四种可能:1) 由当前结点的左子树结点到右子树结点2) 由当前结点到其左子树某一节点3) 由当前结点到其右子树某一节点4) 由当前结点本身分析完可能性发现不能简单的返回当前结点的最大路径和,对于子节点是情况一而言,父节点拿到子结点的路径

2020-06-16 12:21:05 275

原创 分割等和子集 (递归 二维dp 一维dp)

问题描述:给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/partition-equal-subset-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。大体思路:由于想将数组分割为两个和相同的子集,因此可以先获得数组整体的和,然后该问题可以转化为找数组中是否存在某几个元素之和等于总和的一半。注:若总和为奇数则可以直接返

2020-06-15 10:55:18 280

原创 二分法的两个例子

问题一:转变数组后最接近目标值的数组和(leetcode1300)问题描述:给你一个整数数组arr 和一个目标值target ,请你返回一个整数value,使得将数组中所有大于value 的值变成value 后,数组的和最接近target(最接近表示两者之差的绝对值最小)。如果有多种使得和最接近target的方案,请你返回这些整数中的最小值。请注意,答案不一定是arr 中的数字。示例 1:输入:arr = [4,9,3], target = 10输出:3解...

2020-06-14 21:49:28 1888

原创 并查集及其应用

并查集介绍并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的初始化方法为先让所有的结点自成一个独立的集合,自己作为自己的簇头(是用簇头来标识集合的);若已知两个元素属于同一集合,则将这两个元素所在的集合合并。并操作:将两个元素所在的集合合并查操作:找到给定元素的簇头如下图所示就是unio(a , b)的过程,此外在为了提高并查集的查询效率,一种很容易想到的做法为让并查集尽可能的矮,因此在查询的过程中,将查到的中间结点的都连到其簇头下面。案例一:等式.

2020-06-08 11:20:03 2459

原创 数组中第k大的元素

问题描述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-largest-.

2020-06-05 16:58:53 246

原创 前缀树及其应用

前缀树又称为字典树,单词查找树。其最大的优点为利用字符串的公共前缀极大的提高字符串的查询效率。如下图所示为“apple”,“app”,“apply” “pen”组成的前缀树结构问题一:leetcod208实现前缀树问题描述:实现一个 Trie (前缀树),包含insert,search, 和startsWith这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // ...

2020-06-05 09:32:37 600

原创 拓扑排序及其应用

AOV网的概念:AOV网是有向无环图的一种,全称Activity OnVertex Network,顾名思义活动在顶点的网,使用顶点表示活动,顶点之间的边表示活动的先后顺序,例如<a,b>有一条从a到b的边,表示a活动发生在b之前。拓扑排序:在AOV网没有环路的情况下,将这些活动排成一个满足所有边的先后顺序条件线性序列。排序算法:1)选择AOV网中一个没有前驱的结点输出;2)将输出结点从图中删除(并删除与当前结点相连的所有边)3)重复1)2)直到图中没有结点。..

2020-06-01 17:00:33 1195

原创 打家劫舍

问题描述:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。...

2020-05-29 08:46:45 502

原创 单词拆分

问题描述:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定s 是否可以被空格拆分为一个或多个在字典中出现的单词。拆分时可以重复使用字典中的单词。 可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。来源:力扣(LeetCode)链接:https://lee...

2020-05-26 14:25:36 310

原创 子数组和的最大值最小问题

顾名思义,将一个数组分为k个子数组,求解怎么分才可以使得这些子数组中和最大的值最小。案例一:在D天内送达包裹的能力传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。传送带上的第 i个包裹的重量为weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5输出:15解释:船舶..

2020-05-24 11:30:06 1379

原创 子数组和问题II

本次的两个算法题是子数组的积的问题,勉强也能算做子数组和的问题。问题一:乘积小于k的子数组问题描述:给定一正整数数组以及一整数k,要求找到所有乘积小于k的子数组的个数。input : nums = [3 5 2 8] k = 17output: 7 解释: [3] [5] [2] [8] [3 5] [5 2] [2 8]解法一:前缀和 + 二分搜索看到题的第一反应还是用前缀和数组求解。但是由于是乘积可能会出现越界情况,因此对num求对数。此时的乘法就变为了加法。因...

2020-05-17 10:44:13 189

原创 子数组和问题

我们刷leetcod时总是遇到各种各样的子数组和的问题,这类问题一般都是可以通过构建一个前缀和数组,以O(N^2)的时间复杂度求解,但这并不是最优解。问题一:和为K的数组问题描述:给定一整型数组nums和一整数k,找到该数组中和为k的子数组的个数。input : nums = [1,2,3,-3,-2,-1,0] k = 0output: 5 分别为[3,-3], [2,3,-3,-2], [1,2,3,-3,-2,-1], [1,2,3,-3,-2,-1,0] , [0]...

2020-05-16 14:04:12 539

原创 只出现一次的数字问题

问题1给定一整形数组,已知该数组中一个数出现了一次,其余的数出现了偶数次,找到这个出现一次的数解法一:使用hashMap记录次数,然后返回只出现一次的那个数代码如下: public int singleNumber(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); for(int num : nums) { int val = map.c

2020-05-14 16:50:25 220

原创 跳跃游戏

问题描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。..

2020-05-11 14:10:44 200

原创 K个排序链表的合并

问题描述;合并k个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problem...

2020-05-01 10:28:59 327 1

原创 递增子序列问题

首先谈下,子串和子序列的区别,子串指必须是连续,子序列可以不连续,但是不能改变相对位置。本文所有的问题都是针对于子序列的。例如:str = "abcdefg""abc","cdr"为子串,“acd”为子序列,“cad”啥都不是,由于相对位置发生改变。问题一:递增子序列(leetcode491)给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示...

2020-04-16 15:53:55 577

原创 LRU(least recently used)

LRU(least recently used),最近最久未使用置换算法是一种页面置换算法,操作系统中当内存空间不足时,会将内存中暂时不用的信息置换到外存(磁盘)中,用的时候再换进来。所谓最近最久未使用置换算法就是优先将最近未使用(最早进来)的页面置换出去。根据局部性原理,认为最近使用的页面之后再次被使用的概率最大。因此该算法是合理的。一种硬件解决方案是,对于每一个页面记录自上次访问经...

2020-04-05 15:37:02 358

原创 n个骰子的点数

题目描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]示例2:输入: 2输出: [0...

2020-03-12 13:28:58 222

原创 三数之和(双指针法)

问题描述:// 给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?找出所有满足条件且不重复的三元组。//// 注意:答案中不可以包含重复的三元组。//// 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],//// 满足要求的三元组...

2020-01-02 22:23:19 5005

原创 二叉树根到叶子结点数字之和

题目描述:认为二叉树的根到每个叶子结点的路径上的点是一个数,若该条路径有三个结点,则表示的数为根结点节点的值乘100加下一结点值乘10加叶子结点的值。该问题是想求所有路径构成数的和。如上二叉树,其三条路径表示的数分别为:124,135,136则应返回395。解决思路:算法一:看到这种问题最初的想法,不考虑性能只考虑实现,上来二话不说、直接DFS,将所有路径都求出来存入list...

2019-12-25 22:03:11 789 1

原创 二叉树展开为链表(leetcode114)

题目描述:给定一个二叉树,原地将它展开为链表。例如,给定二叉树 1 / \ 2 5/ \ \3 4 6将其展开为:1\ 2 \ 3 \ 4 \ 5 \ 6来源:力扣(LeetCode)链接:https://leetcode-c...

2019-12-24 19:39:14 106

原创 路径总和II(leetcode113)(二叉树,DFS,回溯)

题目描述:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明:叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \...

2019-12-23 22:10:56 186

原创 判断平衡二叉树

平衡二叉树的定义:对于任一结点,其左右子树高度之差不大于1。因此解决该问题自然而然就想到改写求二叉树的高度的算法。如下为求二叉树高度的算法 public int getHeight(TreeNode root) { if(root == null) { return 0; } int leftHe...

2019-12-23 16:20:10 127

原创 二叉树的四种遍历方式(递归+非递归)

关于二叉树的大多数算法题目都是与二叉树的遍历方式有关的,大都解决方案对二叉树的遍历改写即可。下面就主要介绍下二叉树的常用的四种遍历方式。其中DFS(Depth-First-Search)的有三种分别为先序遍历,中序遍历及后序遍历,而使用BFS的只有层序遍历。一.先序遍历先序遍历的顺序为对于当前结点先访问其本身,再访问其左子树,最后访问其右子树。递归实现由于过于简单就只给代码不加描述...

2019-12-22 11:54:13 186

原创 有序数组转化为二叉树(leetcode108)

题目:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / /...

2019-12-22 10:42:15 250

原创 二叉树的序列化和反序列化

便于存储将二叉树等数据结构转化为字符串的形式的磁盘中存储,使用的时候再由字符串转换为二叉树结构即可。下文以先序遍历为例实现二叉树的序列化及反序列化。此外由于结点val的长度未知,避免歧义,在序列化的过程中在每一个节点结束位置都插入 !字符;对于空元素也应使用一特殊字符‘#’标记。序列化过程使用的就是二叉树的先序遍历,不过遍历过程中需将空值也存储起来。实现代码如下: publi...

2019-12-11 15:27:12 138

原创 长度最小的子数组(二分查找 和 双指针滑动窗)

问题描述:给定一个含有n个正整数的数组和一个正整数s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。示例:输入: s = 7, nums = [2,3,1,2,4,3]输出: 2解释: 子数组[4,3]是该条件下的长度最小的连续子数组来源:力扣(LeetCode)链接:https://leetcode-cn.co...

2019-11-19 11:11:15 130

原创 快速求一整数的K次方(二分查找)

问题描述:给定一整数K,N,求出啊K的N次方。若两数相乘时间复杂度为O(1),要求整体时间复杂度为O(logN)。大体思路:可以将N转化为二进制形式,将K^N转化为K的二进制各项方的结果之积。例如K = 8,N = 70:N = 64 + 4 + 2 ;8^70 = 8^ 64 * 8 ^4 * 8^2;可以一次计算8^1,8^2,8^4 .......8^64各项,可以发现...

2019-11-17 09:57:27 492

原创 完全二叉树的结点个数(二分查找)

题目描述:给定一完全二叉树头结点,返回该二叉树的结点个数,要求时间复杂度为低于O(logN)。大体思路:由于该二叉树为完全二叉树,所以其的两个子树至少有一个是满二叉树。有如下两种情况:可以发现左边的二叉树的根结点的左子树为满二叉树,右根结点的右子树为满二叉树。那么如何判断二叉树属于以上哪种情况呢?可以用右子树高度来判断,若右子树的高度 = 整体高度 - 1则说明右子...

2019-11-16 21:18:36 655 1

原创 找整型不重复有序数组中到值等于下标的元素

问题描述:给定一有序、不含重复元素的整型数组arr,找到满足arr[i] == i中最小的元素。要求时间复杂度为O(logN).实现思路:由于下标的增长速度始终为一,而arr的增长速度恒大于等于一,可以利用这一点将搜索域逐步减半;对中间元素进行判断若大于其下标,则可知后半段是不存在满足题设条件的解的;若小于其下标,同理前半段无可行解;等于时,之后无可行解。如此便可以O(logN)的...

2019-11-16 19:37:53 252 1

原创 循环有序数组中最小元素的查找(二分查找)

问题描述:如题,其中循环有序数组指的是对有序数组进行循环移位后的结果,如[7,8,9,0,1,2,3,4,5,6];实现思路:由循环有序数组结构可知,若数组不为整体有序,则最小值一定是处于无序子序列之中,如上述例子中,最小值一定处于7到1之间,而一定不处于1到6之间,根据该性质可以得到如下算法:先进行判断该数组是否整体有序(arr[left] < arr[right]),若有...

2019-11-15 19:58:34 1826

原创 局部小值的查找(二分查找)

问题描述:给定一任意相邻元素不重复的无序数组,找到其中任意一个局部最小值。(注:局部最小值的定义为该位置的元素小于其左右两个元素,对于首元素,只需小于后一个,尾元素小于前一个即可)大体思路:先进行首尾元素判断,若为局部最小值返回即可,否则从两边出发的趋势为下降的。如下图:由上图可知left到right之间一定存在局部最小点。mid = left + (right - lef...

2019-11-15 17:34:52 460

原创 对于StringTable的理解

String table又称为String pool,字符串常量池,其存在于堆中(jdk1.7之后改的)。最重要的一点,String table中存储的并不是String类型的对象,存储的而是指向String对象的索引,真实对象还是存储在堆中。此外String table还存在一个hash表的特性,里面不存在相同的两个字符串。此外String对象调用intern()方法时,会先在Strin...

2019-11-10 22:03:37 9118 2

原创 链表相交问题

问题描述:给定两链表的头结点,判断两链表是否存在公共部分(相交),若相交返回相交的第一个节点。经分析发现该问题可以分成如下两个子问题进行解决。子问题一:两无环链表是否相交算法一:假设list1长度为L1,list2长度为L2,假设公共部分长为m,由L1 + L2 - m = L2 + L1 -m可知第一路先遍历list1,再遍历list2,第二路先遍历list2再遍历list1,若...

2019-11-08 17:40:54 137

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除