- 博客(94)
- 收藏
- 关注
原创 LeetCode 热题 HOT 100 - 48. 旋转图像
思路:先以对角线(左上<—>右下)为轴进行翻转,再对每行左右翻转即可参考官方解答方法三https://leetcode-cn.com/problems/rotate-image/solution/xuan-zhuan-tu-xiang-by-leetcode-solution-vu3m/class Solution { public void rotate(int[][] matrix) { int n = matrix.length;//行数 ..
2021-03-13 15:59:45
235
原创 LeetCode 热题 HOT 100 - 46. 全排列
思路:回溯(树形结构上的深度优先遍历)回溯算法的复杂度主要由递归树的节点个数决定,时间复杂度是指数级别的,本质上是一种遍历的算法!回溯算法是用一份状态变量遍历整个状态空间的方法,只需要在合适的状态做一个保存即可。这种遍历相对于广度优先是节约空间的。class Solution { public List<List<Integer>> permute(int[] nums) { //输入数组长度 int n = nums.len..
2021-03-11 21:12:32
221
原创 LeetCode 热题 HOT 100 - 39. 组合总和
思路:回溯对于这类寻找所有可行解的题,我们都可以尝试用「搜索回溯」的方法来解决。参考https://leetcode-cn.com/problems/combination-sum/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-2/class Solution { public List<List<Integer>> combinationSum(int[] candidates, i..
2021-03-11 19:57:29
214
原创 LeetCode 热题 HOT 100 - 34. 在排序数组中查找元素的第一个和最后一个位置
思路:二分查找1)查找目标元素在有序数组中出现的第一个位置;如果第一个位置都没有找到的话,说明目标元素在有序数组中并不存在。2)查找目标元素在数组中出现的最后一个位置;如果找到了最后一个位置,就将第一个位置和最后一个位置封装成一个数组返回。——时间复杂度: O(logn) ,其中 n 为数组的长度。二分查找的时间复杂度为 O(logn),一共会执行两次,因此总时间复杂度为 O(logn)。——空间复杂度:O(1) 。只需要常数空间存放若干变量。class Solution {..
2021-03-11 17:11:43
181
原创 LeetCode 热题 HOT 100 - 31. 下一个排列
“下一个排列”的定义是:给定数字序列的字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。思路:——时间复杂度:O(N),其中 N 为给定序列的长度。我们至多只需要扫描两次序列,以及进行一次反转操作。——空间复杂度:O(1),只需要常数的空间存放若干变量。class Solution { public void nextPermutation(int[] nums) { int i = nums.length -..
2021-03-10 21:17:37
107
原创 LeetCode 热题 HOT 100 - 22. 括号生成
思路:回溯参考https://leetcode-cn.com/problems/generate-parentheses/solution/pei-yang-chou-xiang-si-wei-hui-su-jie-fa-7dwu/class Solution { public List<String> generateParenthesis(int n) { List<String> res = new ArrayList<Strin..
2021-03-10 20:42:05
115
原创 LeetCode 热题 HOT 100 - 19. 删除链表的倒数第 N 个结点
思路:双指针删除倒数第n个节点等价于从列表头开始数起的第(L-n+1)个节点,其中L是链表的长度先让快指针前进两步,同时移动快慢指针,直到快指针走过最后一个节点,此时慢指针指向倒数第n+1个节点;删去慢指针的后继即可。 时间复杂度:O(L),其中L是链表的长度。 空间复杂度:O(1)。 /** * Definition for singly-linked list. * public class ListNode { * ...
2021-03-10 19:27:15
101
原创 LeetCode 热题 HOT 100 - 17. 电话号码的字母组合
思路:回溯1)建立数字->字母的映射关系;2)定义递归函数(注:如果是纯字符串拼接,会生成很多临时对象,性能会略差,Java实现中是用StringBuilder做拼接的,经测试耗时0毫秒,如果是用String类型做拼接耗时是6毫秒)class Solution { public List<String> letterCombinations(String digits) { List<String> combinations...
2021-03-10 16:56:08
133
原创 LeetCode 热题 HOT 100 - 15. 三数之和
思路:排序+双指针问题就变成:在一个排序数组中找到所有的两数之和使得其和等于一个特殊值?可以通过双指针法在O(N)时间内解决这个问题。即两个指针分别指向数组的首尾,如果和小于目标值,头指针向后移,使得和增大;如果和大于目标值,尾指针向前移,使得和减小。——时间复杂度:O(N^2),其中 N 是数组nums 的长度。——空间复杂度:O(logN)。我们忽略存储答案的空间,额外的排序的空间复杂度为 O(logN)。然而我们修改了输入的数组 nums,在实际情况下不一定允许,因此也可以看成使用..
2021-03-10 11:15:59
133
原创 LeetCode 热题 HOT 100 - 11. 盛最多水的容器
思路:双指针在初始时,左右指针分别指向数组的左右两端;然后我们需要移动一个指针。移动哪一个呢?直觉告诉我们,应该移动对应数字较小的那个指针(即此时的左指针)。这是因为,由于容纳的水量是由 两个指针指向的数字中较小值 * 指针之间的距离 决定的。 时间复杂度:O(N),双指针总计最多遍历整个数组一次。 空间复杂度:O(1),只需要额外的常数级别的空间。 public class Solution { public int maxArea(int[] height) { ..
2021-03-10 10:33:56
105
原创 LeetCode 热题 HOT 100 - 5. 最长回文子串
子串:原始字符串的一个连续子集子序列:原始字符串的一个子集思路:动态规划回文串是天然具有状态转移性质的,这是因为一个回文去掉两头以后,剩下的部分依然是回文。回文的长度要严格大于2。如果一个子串两头的字符不相等,一定不是回文串。如果一个子串两头的字符相等,需要看去掉两头以后剩下部分的子串是否是回文。...
2021-03-10 10:03:48
159
原创 LeetCode 热题 HOT 100 - 3. 无重复字符的最长子串
思路:滑动窗口1)我们使用两个指针表示字符串中的某个子串(或窗口)的左右边界,其中左指针代表着上文中「枚举子串的起始位置」,而右指针即为上文中的「不包含重复字符的最长子串的结束位置」;2)在每一步的操作中,我们会将左指针向右移动一格,表示 我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着 以左指针开始的,不包含重复字符的最长子串。我们记录下这个子串的长度;3)在枚举结束后,我们找到的最长的..
2021-03-08 19:29:27
212
原创 LeetCode 热题 HOT 100 - 2. 两数相加
思路:——时间复杂度:O(max(m,n)),其中 m,n 为两个链表的长度。我们要遍历两个链表的全部位置,而处理每个位置只需要 O(1) 的时间。——空间复杂度:O(max(m,n))。答案链表的长度最多为较长链表的长度 +1。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ..
2021-03-08 17:15:20
175
原创 LeetCode 热题 HOT 100 - 617. 合并二叉树
思路1:深度优先搜索可以使用深度优先搜索合并两个二叉树。从根节点开始同时遍历两个二叉树,并将对应的节点进行合并。两个二叉树的对应节点可能存在以下三种情况,对于每种情况使用不同的合并方式。 如果两个二叉树的对应节点都为空,则合并后的二叉树的对应节点也为空; 如果两个二叉树的对应节点只有一个为空,则合并后的二叉树的对应节点为其中的非空节点; 如果两个二叉树的对应节点都不为空,则合并后的二叉树的对应节点的值为两个二叉树的对应节点的值之和,此时需要显性合并...
2021-03-08 15:52:08
123
原创 LeetCode 热题 HOT 100 - 543. 二叉树的直径
思路:注意题目要求不能使用额外空间,这就是题目的难点所在。这道题的描述部分包含了非常重要的信息,1 ≤ a[i] ≤ n,即每个数字本身都对应一个 i-1 的数组下标。我们可以利用数组内容本身跟数字下标的关联找出缺失的数字。...
2021-03-08 10:58:02
106
原创 LeetCode 热题 HOT 100 - 283. 移动零
思路:双指针(快慢指针)初始状态:i (fast)指向当前遍历的元素 ; j (slow)表示下一个非0元素存放的位置 时间复杂度:O(n),其中n为序列长度。每个位置至多被遍历两次。 空间复杂度:O(1)。只需要常数的空间存放若干变量。 public void moveZeroes(int[] nums) { if (nums == null || nums.length == 0) { return; } int slow...
2021-03-07 16:57:34
87
原创 LeetCode 热题 HOT 100 - 234. 回文链表
思路:快慢指针避免使用 O(n) 额外空间的方法就是改变输入。我们可以将链表的后半部分反转(修改链表结构),然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。虽然不需要恢复也能通过测试用例,但是使用该函数的人通常不希望链表结构被更改。该方法虽然可以将空间复杂度降到 O(1),但是在并发环境下,该方法也有缺点。在并发环境下,函数运行时需要锁定其他线程或进程对链表的访问,因为在函数执行过程中链表会被修改。整个流程可以分为以下五个步骤:过滤掉空链表或者单节点链表的情况,这..
2021-03-06 21:54:29
146
原创 LeetCode 热题 HOT 100 - 226. 翻转二叉树
思路:递归从根节点开始,递归地对树进行遍历,并从叶子结点先开始翻转。如果当前遍历到的节点 \textit{root}root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 \textit{root}root 为根节点的整棵子树的翻转。——时间复杂度:O(N),其中 N 为二叉树节点的数目。我们会遍历二叉树中的每一个节点,对每个节点而言,我们在常数时间内交换其两棵子树。——空间复杂度:O(N)。使用的空间由递归栈的深度决定,它等于当前节点在二叉树中的高度。在平均情况下..
2021-03-06 20:51:38
130
原创 LeetCode 热题 HOT 100 - 206. 反转链表
思路1:迭代初始:——时间复杂度:O(n),其中n是链表的长度。需要遍历链表一次。——空间复杂度:O(1)。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListN...
2021-03-06 20:32:48
156
原创 LeetCode 热题 HOT 100 - 160. 相交链表
思路:双指针法——时间复杂度 :O(m+n)——空间复杂度 :O(1)/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public ListNod...
2021-03-06 17:08:30
107
原创 LeetCode 热题 HOT 100 - 155. 最小栈
思路:辅助栈1)初始化数据栈和辅助栈 2)push操作时,首先将元素压入数据栈,需要保持辅助栈的栈顶为最小值,如果当前元素是当前最小值需要压入辅助栈 3)pop操作时,首先删除数据栈的栈顶元素,若该元素是当前的最小值,也需要删除辅助栈的栈顶元素 4)top操作时,返回数据栈的栈顶元素 5)getMin操作时,返回辅助栈的栈顶元素——时间复杂度:对于题目中的所有操作,时间复杂度均为 O(1)。因为栈的插入、删除与读取操作都是 O(1),我们定义的每个操作最多调用栈操作两次。——空间复杂度:O(..
2021-03-06 16:41:45
133
原创 LeetCode 热题 HOT 100 - 141. 环形链表
思路1:哈希表使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可——时间复杂度:O(N),其中 N 是链表中的节点数。最坏情况下我们需要遍历每个节点一次。——空间复杂度:O(N),其中 N 是链表中的节点数。主要为哈希表的开销,最坏情况下我们需要将每个节点插入到哈希表中一次。/** * Definition for singly-linked list...
2021-03-06 15:42:15
152
原创 LeetCode 热题 HOT 100 - 136. 只出现一次的数字
思路:如果不考虑时间复杂度和空间复杂度的限制,这道题有很多种解法,可能的解法有如下几种。1) 使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。2) 使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。3) 使用集合存储数组中出现的所有数字,并计算数组中的元素之和。由于集合保证元素无重复,因此计..
2021-03-06 11:38:54
180
原创 LeetCode 热题 HOT 100 - 121. 买卖股票的最佳时机
思路:假设给定的数组为:[7, 1, 5, 3, 6, 4]如果我们在图表上绘制给定数组中的数字,我们将会得到:我们来假设自己来购买股票。随着时间的推移,每天我们都可以选择出售股票与否。那么,假设在第 i 天,如果我们要在今天卖股票,那么我们能赚多少钱呢?显然,如果我们真的在买卖股票,我们肯定会想:如果我是在历史最低点买的股票就好了!太好了,在题目中,我们只要用一个变量记录一个历史最低价格 minprice,我们就可以假设自己的股票是在那天买的。那么我们在第 i 天卖出股票能得到的利..
2021-03-06 10:58:42
92
原创 LeetCode 热题 HOT 100 - 94. 二叉树的中序遍历
思路1:递归定义 inorder(root) 表示当前遍历到 root 节点的答案,那么按照定义,我们只要递归调用 inorder(root.left) 来遍历 root 节点的左子树,然后将 root 节点的值加入答案,再递归调用inorder(root.right) 来遍历 root 节点的右子树即可,递归终止的条件为碰到空节点。——时间复杂度:O(N)——空间复杂度:O(N)/** * Definition for a binary tree node. * public c..
2021-03-03 22:23:13
130
1
原创 LeetCode 热题 HOT 100 - 111. 二叉树的最小深度
思路1:深度优先搜索首先可以想到使用深度优先搜索的方法,遍历整棵树,记录最小深度。对于每一个非叶子节点,我们只需要分别计算其左右子树的最小叶子节点深度。这样就将一个大问题转化为了小问题,可以递归地解决该问题。——时间复杂度:O(N)其中N是树的节点数。对每个节点访问一次。——空间复杂度:O(H)其中 H 是树的高度。空间复杂度主要取决于递归时栈空间的开销,最坏情况下,树呈现链状,空间复杂度为 O(N)。平均情况下树的高度与节点数的对数正相关,空间复杂度为 O(logN)/*...
2021-03-02 21:43:48
133
原创 LeetCode 热题 HOT 100 - 110. 平衡二叉树
根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。思路1:自顶向下递归定义函数height,用于计算二叉树中的任意一个节点 p 的高度:有了计算节点高度的函数,即可判断二叉树是否平衡。具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 11,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这是一个自顶向下的递归的..
2021-03-02 20:28:06
104
原创 LeetCode 热题 HOT 100 - 108. 将有序数组转换为二叉搜索树
思路:递归二叉搜索树(BST) : 根节点左子树的值都小于根节点的值,根节点右子树的值都大于根节点的值。这和题中的排序数组有什么关联呢?如果选定一个值作为根节点,那么数组中,左侧的元素即左子树,右侧的元素即右子树,而左侧的树也是排序的,所以构造左子树的过程和原问题一致,根据对称性,右子树同理。这样就构造出一个子问题:假设选取数组中的一个元素作为根节点,那么对于该元素左侧的元素递归构成左子树,对于该元素右侧的元素递归构成右子树,现在如何选取根节点成了唯一的问题!排序数组到BST的映射不..
2021-03-02 17:03:47
73
原创 LeetCode 热题 HOT 100 - 104. 二叉树的最大深度
思路1:深度优先搜索如果我们知道了左子树和右子树的最大深度l 和r,那么该二叉树的最大深度即为max(l,r)+1——时间复杂度:O(N) 因为需要遍历每一个节点——空间复杂度:O(height) 因为用到递归,递归所用的空间等于递归的深度,即树的深度/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre...
2021-03-02 11:34:43
106
原创 LeetCode 热题 HOT 100 - 101. 对称二叉树
思路1:递归如果一个树的左子树与右子树镜像对称,那么这个树是对称的。因此,该问题可以转化为:两个树在什么情况下互为镜像?1.两棵树本身根节点相同 2.子树互为镜像/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode..
2021-03-02 10:38:31
116
原创 LeetCode 热题 HOT 100 - 70. 爬楼梯
思路:动态规划爬到每一级台阶的方法看作一个状态,用dp数组记录n个状态,从1到n依次更新每个状态。class Solution { public int climbStairs(int n) { if(n==1){ return 1; } int[] dp = new int[n+1]; dp[1]=1; dp[2]=2; for(int i=3;i<=n;..
2021-02-28 22:18:03
89
原创 LeetCode 热题 HOT 100 - 53. 最大子序和
思路:动态规划若前一个元素大于0,则将其加到当前元素上。当i指到-2时是初始值,当i指向1时,因为前一个元素是-2<0,所以保持当前元素不变,当i指向-3时,因为前一个元素是1>0,因此将前一个元素加到当前元素上,-3变为-2,依此类推,最后通过取列表中最大元素得到想要的答案。代码实现:遍历数组元素,若前一个元素大于0,则将其加到当前元素上,最后返回修改过的数组中的最大值。——时间复杂度:O(N),只遍历一次数组——空间复杂度:O(1),动态规划算法没..
2021-02-28 21:43:31
87
原创 LeetCode 热题 HOT 100 - 21. 合并两个有序链表
思路:链表问题考虑哑节点!引入哑节点,值设为-1,作为合并链表的头节点之前prehead;l1,l2分别指向传入链表的头节点。比较l1,l2,把prev.next指向较小的那个,prev和较小的指针分别向前移动,这里由于l1和l2的值相同,不妨先移动l2,依此类推。重复该过程,直至遍历完整个链表。 /** * Definition for singly-linked list. * public class ListN...
2021-02-28 18:27:06
117
原创 LeetCode 热题 HOT 100 - 20.有效的括号
思路:判断括号的有效性可以使用「栈」这一数据结构来解决。先出现的左括号后匹配——先进后出用栈!此题,把左括号加入栈,匹配的过程就是出栈的过程。代码实现:1定义辅助函数判断一对符号是否匹配 2核心函数:字符串空返回真;遍历字符串,如果是右括号的情况,判断栈顶是否是匹配的左括号,匹配成功则出栈;如果是左括号,入栈等待匹配;最后,完全匹配的要求是栈为空。class Solution { public boolean isValid(Stri...
2021-02-28 17:41:39
143
原创 LeetCode 热题 HOT 100 -1.两数之和
class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> hashmap = new HashMap<Integer,Integer>(); for(int i=0;i<nums.length;i++){ if(hashmap.containsKey(target-nums[i])){ ...
2021-02-28 17:07:07
101
原创 TensorBoard在win10, Pycharm中的使用
TensorBoard是TensorFlow的可视化工具,它可以通过TensorFlow程序运行过程中输出的日志文件可视化TensorFlow程序的运行状态。环境:已经在Pycharm上安装好TensorFlow及TensorBoard Python3.6一. TensorBoard使用的简单例程import tensorflow as tf# 定义一个简单的计算图,实现向量...
2020-01-05 20:11:31
716
原创 libsvm学习——windows环境下libsvm-3.23在Python的安装过程
一.libsvm简介 libsvm是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库,这套库运算速度挺快,可以很方便的对数据做分类或回归。由于libsvm程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。 libsvm包含的内容:(1)java文件夹,主要应用于java平台;(2)...
2019-03-19 21:38:56
1677
2
原创 git clone时报错error: RPC failed; curl 18 transfer fatal: The remote end huclosed with outstanding read
最近在使用git clone命令从github克隆源码到电脑时出现了以下问题究其原因是因为项目太久,tag资源文件太大解决方法一:终端输入git config --global http.postBuffer 524288000一般就能解决,但是我并不能成功,git clone 还是报上述错误解决方法二:将https地址换成ssh地址来clone我就是用...
2019-03-14 12:38:33
487
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人