leetcode

ARTS-1

天大地大妈咪最大 提交于 2019-12-04 05:02:29
ARTS的初衷 Algorithm:主要是为了编程训练和学习。 每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell 。 Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。 所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。 Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。 学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。 Share:主要是为了建立你的影响力,能够输出价值观。 分享一篇有观点和思考的技术文章。 作者:陈皓 链接: https://www.zhihu.com/question/301150832/answer/529809529 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Algorithm 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数

前端与算法 leetcode 66. 加一

北城以北 提交于 2019-12-04 03:31:33
目录 # 前端与算法 leetcode 66. 加一 题目描述 概要 提示 解析 解法一 解法二 算法 # 前端与算法 leetcode 66. 加一 题目描述 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123。 示例 2: 输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321。 66. 加一 概要 考虑一下进位情况即可,新建一个空数组,长度是传入数组的长度+1,然后给第一个位+1返回此数组即可 提示 解析 解法一 题的意思只是加一,这意味着它的情况只有两种,末位为9或不为9 末位为9时加一位时进位为0,如果不出现进位运算时结束循环 考虑特殊情况99,99999等,手动创建数组填入0 解法二 从后往前依次给每个数加一,加一后大于10则对10取余,一直到数组的头部的时候 i===0 数组头部加入一位1即可 算法 /** * @param {number[]} digits * @return {number[]} */ var plusOne = function(digits) { for (let i = digits

前端与算法 leetcode 350. 两个数组的交集 II

限于喜欢 提交于 2019-12-04 03:27:10
目录 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 概要 提示 解析 解法一:哈希表 解法二:双指针 解法三:暴力法 算法 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9] 说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。 我们可以不考虑输出结果的顺序。 进阶: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多,哪种方法更优? 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办? 350. 两个数组的交集 II 概要 这道题可以看成一道传统的映射题,我们需要知道每个值出现的次数,映射关系为<元素,出现次数>,首先统计数组1中所有元素出现的次数,再遍历数组2即可,如果数组2中的元素存在且大于1,则表示已经找到一个相同的了,如果值等于1,直接删除[ 1 ] 提示 哈希表,双指针,暴力 解析 解法一:哈希表 时间复杂度O(n)

【LeetCode】99. Recover Binary Search Tree 解题报告(Python)

試著忘記壹切 提交于 2019-12-04 02:30:14
【LeetCode】99. Recover Binary Search Tree 解题报告(Python) 标签(空格分隔): LeetCode 题目地址: https://leetcode.com/problems/recover-binary-search-tree/description/ 题目描述: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Note: A solution using O(n) space is pretty straight forward. Could you devise a constant space solution? 题目大意 删除二叉树中指定一节点,并调整二叉树,使得结果的二叉树仍然满足BST的条件。 解题方法 同学们,看到BST就想什么?对,中序遍历是有序的。 那么,如果其中两个被交换了,那么中序遍历的结果一定也就不对了。比如: [1, 2, 3, 4, 5, 6] ==> [1, 5, 3, 4, 2, 6] 那么,可以看出5这个数字比后面的3大,说明他被打乱了;另外2这个数字,比前面的数字4小,所以他也被打乱了。 所以

LeetCode099——恢复二叉搜索树

旧时模样 提交于 2019-12-04 02:29:10
我的LeetCode代码仓: https://github.com/617076674/LeetCode 原题链接: https://leetcode-cn.com/problems/recover-binary-search-tree/description/ 题目描述: 知识点:二叉搜索树、中序遍历 思路一:中序遍历 这个思路和 LeetCode098——验证二叉搜索树 中的思路二是一致的。 对于一棵二叉搜索树而言,其中序遍历的结果是一个递增序列。我们保存原二叉搜索树中序遍历的结果。再对该结果进行排序后得到另一个序列,比较两个序列中的不同的两个值,即为需要交换的两个错误节点。 这里我采用的是递归的形式实现中序遍历,更多中序遍历算法请见 LeetCode094——二叉树的中序遍历 。 时间复杂度是O(nlogn),其中n为树中的节点个数。空间复杂度也是O(n)。 JAVA代码: public class Solution { List<TreeNode> list; public void recoverTree(TreeNode root) { list = new ArrayList<>(); inorderTraversal(root); List<TreeNode> tempList = new ArrayList<>(list); Collections.sort

Leetcode算法Java全解答--46. 全排列

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-04 00:47:15
Leetcode算法Java全解答–46. 全排列 文章目录 Leetcode算法Java全解答--46. 全排列 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 想法 将原数组,最终结果数组,某次的数组 进行递归 当循环到最后一个的时候,就往最终结果数组 里面 添加 某次的数组 如果没循环到最后一个的时候,继续调用原来的归方法 结果 超过26%的测试案例 时间复杂度/空间复杂度: /n 总结 // TODO 执行过程 result: []smallResult: [] result: []smallResult: [1] result: []smallResult: [1, 2] result: []smallResult: [1, 2, 3] result: [[1, 2, 3]]smallResult: [1, 3] result: [[1, 2, 3]]smallResult: [1, 3, 2] result: [[1, 2, 3], [1, 3, 2]]smallResult: [2] result: [[1, 2, 3], [1, 3,

leetcode -- Search in Rotated Sorted Array I &II 重点可以考

旧城冷巷雨未停 提交于 2019-12-04 00:46:54
https://leetcode.com/problems/search-in-rotated-sorted-array/ https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ 暂时先只了解思路就行。就是BS, 二分的变种。 只是这里边界条件不好确定,可以分的情况太多。复习的时候再写一下。 我们要参考 http://blog.allenzhao.com/leetcode/2014/09/16/LeetCode-Search-in-Rotated-Sorted-Array/ 这里的图, 那张图用将搜索区间按break point分成了M1,M2,我们只需要每次搜索的时候drop掉M1或者M2就行了。 没有duplicate class Solution: # @param A, a list of integers # @param target, an integer to be searched # @return an integer def search(self, A, target): left = 0 ; right = len (A) - 1 while left <= right : mid = ( left + right ) / 2 if target == A[ mid ]:

leetcode 410 split-array-largest-sum

社会主义新天地 提交于 2019-12-04 00:46:11
leetcode 410 split-array-largest-sum 1、题目描述: 给出一个数组,例如: [7,2,5,10,8],在给出一个整数m = 2,将这个数组切成m个非空连续的小数组,写出一个算法使得 其中各个小数组的和的最大值尽可能的小。 题目链接: https://leetcode.com/problems/split-array-largest-sum/description/ 2、题目思路描述: 这个题是一道hard难度的题,如上述例子: nums = [7,2,5,10,8] m = 2 数组可以分为两部分,[7,2,5] [10,8] 这个数组分割后最大的和为18。 我们可以利用二分的思想来搜索这个尽可能小的数组和。二分搜索可以说是一个猜答案的过程。 数组的最大和就是整个数组的和,最小值为0,在这个区间内我们进行搜索。 我们可以把每个小数组想象成一个篮子,这样就有m个篮子,数组的每个元素都为一个权重为nums[i]的物品, 二分搜索的目的就是在区间[0,sum(nums)]内找到最小的篮子的容量,且m个篮子需装下所有的物品。 3、题目代码描述: GitHub源码地址: https://github.com/distanceNing/leetcode/blob/master/array/410_split_array.cpp 以下为代码实现: class

[LeetCode]--242. Valid Anagram(Count table && char array sort())

谁说胖子不能爱 提交于 2019-12-04 00:45:55
1. Program Problem Link: https://leetcode.com/problems/valid-anagram/ 2. Solution 2.1. Count Table Solution public class Solution { public boolean isAnagram (String s, String t) { if (s.length() != t.length()) return false ; boolean res = true ; int [] ctable = new int [ 26 ]; for ( int i = 0 ; i < s.length(); i++) { ctable[s.charAt(i) - 'a' ]++; ctable[t.charAt(i) - 'a' ]--; } for ( int j : ctable) if (j != 0 ) return false ; return true ; } } Sort Array Solution public class Solution { public boolean isAnagram (String s, String t) { char [] sChar = s.toCharArray(); char [] tChar = t

Leetcode算法Java全解答--80. 删除排序数组中的重复项 II

蓝咒 提交于 2019-12-04 00:45:32
Leetcode算法Java全解答–80. 删除排序数组中的重复项 II 文章目录 Leetcode算法Java全解答--80. 删除排序数组中的重复项 II 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); } 示例: 示例 1: 给定 nums = [1,1,1,2,2,3], 函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定