![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
harkecho
这个作者很懒,什么都没留下…
展开
-
2020-08-25
剑指 Offer 38. 字符串的排列输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]限制:1 <= s 的长度 <= 8public class Exam38_permutation { List<String> list = new ArrayList<>(); //原创 2020-08-25 07:24:01 · 138 阅读 · 0 评论 -
2020-08-24
518. 零钱兑换 II给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。示例 1:输入: amount = 5, coins = [1, 2, 5]输出: 4解释: 有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1示例 2:输入: amount = 3, coins = [2]输出: 0解释: 只用面额2的硬币不能凑成总金额3。示例 3:输入: amount = 10, coins原创 2020-08-24 17:31:49 · 115 阅读 · 0 评论 -
2020-08-20
异或的性质两个数字异或的结果a^b是将 a 和 b 的二进制每一位进行运算,得出的数字。 运算的逻辑是如果同一位的数字相同则为 0,不同则为 1异或的规律任何数和本身异或则为0任何数和 0 异或是本身136 只出现一次的数字 除一个数字出现一次,其他都出现了两次,让我们找到出现一次 的数执行一次全员异或即可def singleNumber(self, nums:List[int]) -> int: single_number = 0 #初始值为0,因为0异或任何数都是任何数本身原创 2020-08-19 22:47:36 · 143 阅读 · 0 评论 -
螺旋矩阵
59. 螺旋矩阵 II给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3输出:[[ 1, 2, 3 ],[ 8, 9, 4 ],[ 7, 6, 5 ]]func generateMatrix(_ n: Int) -> [[Int]] { var result = [[Int]](repeating: [Int](repeating: 0, count: n), count: n) v原创 2020-08-19 14:47:41 · 233 阅读 · 0 评论 -
2020-08-19
11. 盛最多水的容器示例:输入:[1,8,6,2,5,4,8,3,7]输出:49方法一:暴力解法 O(n^2)public int maxArea(int[] height) { int maxArea = 0; for (int i = 0; i < height.length - 1; i++) { for (int j = i + 1; j < height.length; j++) { maxArea = Math.max(maxArea, Math.min原创 2020-08-19 09:12:54 · 82 阅读 · 0 评论 -
2020-08-18
9. 回文数判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。方法一;/* 1111 div = 1 1111 / 1 = 1111 >原创 2020-08-18 06:21:34 · 89 阅读 · 0 评论 -
2020-08-17
53. 最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。...原创 2020-08-17 07:32:42 · 113 阅读 · 0 评论 -
2020-08-15
4. 寻找两个正序数组的中位数给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5。中位数和两个有序数组的长度之和有关:当两个原创 2020-08-16 11:12:29 · 131 阅读 · 0 评论 -
训练营算法题
数组,链表,跳表:参考链接Java 源码分析(ArrayList)Linked List 的标准实现代码Linked List 示例代码Java 源码分析(LinkedList)LRU Cache - Linked list: LRU 缓存机制* Redis - Skip List:跳跃表、为啥 Redis 使用跳表(Skip List)而不是使用 Red-Black?Array 实战题目两数之和(近半年内,字节跳动在面试中考查此题达到 152 次)盛最多水的容器(腾讯、百度、字节跳动原创 2020-08-12 08:32:03 · 383 阅读 · 0 评论 -
2020-08-10
387. 字符串中的第一个唯一字符剑指 Offer 50. 第一个只出现一次的字符给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = “leetcode” 返回 0s = “loveleetcode” 返回 2 func firstUniqChar(_ s: String) -> Character { var table: [Character: Int] = [:] for c i原创 2020-08-10 09:41:49 · 114 阅读 · 0 评论 -
高级字符串算法
72. 编辑距离给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)示例 2:输入:word1 = “原创 2020-08-06 07:14:25 · 240 阅读 · 0 评论 -
字典树和并查集
字典树Trie字典树的数据结构字典树,即Trie树,又称单词查找树或键树,是一种树型结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计优点:最大限度地减少无谓字符串比较,查询效率比哈希表高字典树的基本性质结点本身不存完整单词从根节点到某一结点,路径上经过的字符连接起来,为该结点对应的字符串每个结点的所有子结点代表的字符都不相同结点存储额外信息. 下图中的数字表示单词的统计频次,然后给用户做相应的推荐(很多时候统计单词的频次,就会加一个原创 2020-07-21 08:40:53 · 184 阅读 · 0 评论 -
2020.7.10
剑指 Offer 07. 重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3, 9, 20, 15, 7]中序遍历 inorder = [9, 3, 15, 20, 7]返回如下的二叉树:3/ 9 20/ 15 7方法一:递归二叉树的前序遍历顺序是:根节点、左子树、右子树,每个子树的遍历顺序同样满足前序遍历顺序。二叉树的中序遍历顺序是:左子树、根节点、右原创 2020-07-10 07:21:11 · 94 阅读 · 0 评论 -
贪心算法Greedy笔记与应用
贪心算法是一种在每一步选择中都采用在当前状态下最好或最优(即最有利)的选择, 从而希望导致结果是全局最好或者最优的算法.(用贪心算法,尤其是最基础的贪心,每次当下情况下找到最优不一定能够达到全局最优的情况)贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退.动态规划会保存以前的运算结果, 并根据以前的结果对当前进行选择, 有回退功能.对比:贪心: 当下做局部最优判断回溯: 能够回退动态规划: 最优判断 + 回退 (带最优判断的回溯,我们叫做动态规划,动态规划会保存以前的运算原创 2020-07-01 06:50:52 · 333 阅读 · 0 评论 -
LeetCode 刷题一
9 回文数/*判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。*/ public boolean isPalindrome(int x) { /* .原创 2020-06-26 19:27:55 · 361 阅读 · 0 评论 -
leetcode 二分查找与x的平方根
704 二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4示例 2:输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1二分查找.原创 2020-06-25 06:17:10 · 138 阅读 · 0 评论 -
189. 旋转数组, 寻找旋转排序数组中的最小值
旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例1 输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例2 输入: [-1,-100,3,99] 和 k = 2输出: [3,99,-1,-100]解释:向右旋转 1 步: [99,-1,-100,3]..原创 2020-06-20 04:56:49 · 86 阅读 · 0 评论 -
leetcode 75 颜色分类
若干红白黑小球,按照红,白,黑的顺序排列,要求进行一次遍历,不可借助队列,栈给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。注意:不能使用代码库中的排序函数来解决这道题。示例:输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] public void sortColors(int[] nums) { int p0 = 0, p2 = nums.length - 1, cur原创 2020-06-19 21:37:00 · 128 阅读 · 0 评论 -
合并两个有效链表
public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(-1); ListNode pre = dummy; while (l1 != null && l2 != null) { if (l1.val <= l2.val) { pre.next = l1; .原创 2020-06-16 06:49:56 · 100 阅读 · 0 评论 -
反转字符串
方法一:递归/*复杂度分析时间复杂度:\mathcal{O}(N)O(N)。执行了 N/2N/2 次的交换。空间复杂度:\mathcal{O}(N)O(N),递归过程中使用的堆栈空间。*/public void reverseString(char[] s) { helper(s, 0, s.length - 1);}public void helper(char[] s, int left, int right) { if (left >= right) {return;}原创 2020-06-15 19:50:59 · 249 阅读 · 0 评论 -
整数反转
通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE,设当前计算结果为ans,下一位为pop。从ans * 10 + pop > MAX_VALUE这个溢出条件来看当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出当出现 ans == MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数从an.原创 2020-06-15 18:20:58 · 128 阅读 · 0 评论 -
字符串转换整数
方法一: 字符串的转换明确转化规则空格处理正负号处理数字处理推入数字result = result * 10 + num进行左移操作模式识别:整数运算注意溢出(推入的过程中可能产生溢出,乘10和累加都可能造成溢出)转换为INT_MAX的逆运算比如判断某数乘10是否会溢出,那么就把该数 与INT_MAX/10进行比较//伪代码public static int myAtoi(String str) { // 合法性判断 if (str.isEmpty()) return 0; /原创 2020-06-15 17:29:51 · 175 阅读 · 0 评论 -
两数之和,三数之和
两数之和方法一:暴力(throw new IllegalArgumentException)时间复杂度:O(n^2) 空间复杂度:O(1)public int[] twoSum(int[] nums, int target) { if (null == nums || nums.length < 2) throw new IllegalArgumentException("invalid argument"); for (int i = 0; i < nums.length - 1;原创 2020-06-14 10:55:42 · 154 阅读 · 0 评论 -
二叉树前序,后序,中序遍历以及验证二叉树
二叉树前序遍历public List<Integer> preorderTraversal(TreeNode root) { LinkedList<TreeNode> stack = new LinkedList<>(); LinkedList<Integer> output = new LinkedList<>(); if (root == null) {return output;} stack.add(root); while原创 2020-06-13 08:07:42 · 203 阅读 · 0 评论 -
6.10 leetcode 二叉树的最大深度, 验证二叉搜索树
验证二叉搜索树//方法一:递归 时间O(n) 空间递归用栈空间O(n)public boolean isValidBST(TreeNode root) { return (root, null, null);}public boolean recurse(TreeNode node, Integer lower, Integer upper) { if (node == null) { return true; } int value = node.val; if (lower原创 2020-06-10 11:29:43 · 122 阅读 · 0 评论 -
leetCode589 N叉树的前序遍历
589 N叉树前序遍历给定一个 N 叉树,返回其节点值的前序遍历。返回其前序遍历:[1, 3, 5, 6, 2, 4].// 递归: 时间复杂度O(M),M为N叉树中的子节点个数,空间复杂度为O(M),M表示节点个数class Node { public int val; public List<Node> children; public Node(int val) { this.val = val; }}public List<Integer> pre原创 2020-06-09 16:01:37 · 139 阅读 · 0 评论 -
6.8 移除元素
复习第三遍移除元素方法一: 暴力 空间复杂度O(n^2),时间复杂度O(1)class Solution { public int removeDuplicates(int[] nums) { int length = nums.length;; for (int i = 1; i < length; i++) { if (nums[i-1] == nums[i]) { this.removeElem原创 2020-06-08 13:25:01 · 93 阅读 · 0 评论 -
开课训练
三分看视频理解,7分练习leetcode练习不要死磕(改变自己的学习习惯) 敢于放手,敢于死记硬背代码不懒与看高手代码(国际高票)5遍变为自己的东西(自己很菜,但借势而起)最大误区,leetCode题目只做一遍(90%素人,30%学员)希望自己提高到80%至少做5遍(即使有些题目来不及做,但是要达到之前的题目做了五遍)工具iterm2 + oh -my-zsh简书LeetCode pluginhttps://vscodethemes.com/干货code styleGoogle原创 2020-06-08 07:10:10 · 128 阅读 · 0 评论 -
Git与GitHub操作指南
工作区 暂存区取消用git rm - r —cached to unstageworking directory staging area暂存区 git仓库respositygit 添加一个文件是已修改 -> git add -> 已暂存 -> git commit -> 已提交github上面选择HTTPS协议还是SSH协议,建议选择SSH协议,不用每次敲用户名密码不过如果是HTTPS也可以用git config —global credential.hel原创 2020-06-08 00:03:21 · 193 阅读 · 0 评论 -
leetcode 231 2的幂
基本的优先级需要记住:指针最优,单目运算优于双目运算。如正负号。先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 & 7等价于 (1 << (3 + 2))&7.逻辑运算最后结合。O(logN)public boolean isPowOfTwo(int num) { if (n == 0) return false; // 2, 4, 3 while (n % 2 == 0) { n /= 2; } return原创 2020-06-07 18:43:41 · 138 阅读 · 0 评论 -
6.7 删除元素
27 移除元素O(n^2)public int removeElement(int[] nums, int val) { if(nums.length == 0) return 0; int i = 0, length = nums.length; while(i < length) { if(nums[i] == val) { this.removeIndex(nums, index); i--; length--; } i++; } return i;原创 2020-06-07 16:22:16 · 150 阅读 · 0 评论 -
6.7 爬楼梯注意点
复习:删除重复元素(相关3道)爬楼梯 4中解法(斐波那契三种实现方式)1 斐波那契 1 1 2 3 5 8 …// 第一种: 时间复杂度为 2^(n)int fib(int n) { if(n < 2) return n; return fib(n - 1) + fib(n - 2);}// 第二种:时间复杂度O(n),空间复杂度O(1)public int fib(int n){ int first = 1; int second = 1; for(int原创 2020-06-07 10:31:31 · 165 阅读 · 0 评论 -
会议室
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei),请你判断一个人是否能够参加这里面的全部会议。示例 1:输入: [[0,30],[5,10],[15,20]] 输出: false示例 2:输入: [[7,10],[2,4]] 输出: true public static boolean canAtt...原创 2020-05-05 11:31:41 · 247 阅读 · 0 评论 -
整数反转
1234 / 10 = 123消掉个位数res = (4 * 10) + 3原创 2020-05-05 11:06:39 · 136 阅读 · 0 评论 -
螺旋矩阵(for,while两种实现方式)
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:输入:[[1, 2, 3, 4],[5, 6, 7, 8],[9,10,11,12]]输出: [1,2,3,4,8,...原创 2020-05-04 23:59:29 · 529 阅读 · 0 评论 -
圆圈中最后剩下的数字(约瑟夫问题)
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3 输出: 3示例 2:输入: n = 10, m = 17 输出: 2计算...原创 2020-05-04 22:41:17 · 168 阅读 · 0 评论 -
Pow(x, n) 递归,非递归
实现 pow(x, n) ,即计算 x 的 n 次幂函数。示例1: 输入: 2.00000, 10 输出: 1024.00000示例2: 输入: 2.10000, 3 输出: 9.26100输入: 2.00000, -2 输出: 0.25000 解释: 2^(-2) = 1/(2 ^(2))= 1/4 = 0.25说明: 1: -100.0 < x < 1...原创 2020-05-04 19:46:50 · 638 阅读 · 0 评论 -
两数之和与三数之和
两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]第一种:暴力解法pu...原创 2020-05-04 15:04:19 · 172 阅读 · 0 评论 -
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:1.必须在原数组上操作,不能拷贝额外的数组。2 尽量减少操作次数。用一个指针指向数组中的元素,如果遇到0要把它放在数组最后面,那么如上,如果将0与12交互,那么必然改变了非零元素的相对顺序所以我们遇到非0的就将其挪到前面,...原创 2020-05-04 07:55:38 · 190 阅读 · 0 评论 -
LRUCache缓存机制(Java实现及OC实现)
题目:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。当缓存容量...原创 2020-05-04 07:24:12 · 590 阅读 · 0 评论