- 博客(64)
- 收藏
- 关注
原创 LeetCode 165-比较版本号
public int compareVersion(String version1, String version2) { String[] s1=version1.split("\\."); String[] s2=version2.split("\\."); int len1=s1.length,len2=s2.length; int i,j;...
2019-07-30 22:15:49 118
原创 LeetCode 237-删除链表中的节点
这道题让我们删除链表的一个节点,更通常不同的是,没有给我们链表的起点,只给我们了一个要删的节点,跟我们以前遇到的情况不太一样,我们之前要删除一个节点的方法是要有其前一个节点的位置,然后将其前一个节点的next连向要删节点的下一个,然后delete掉要删的节点即可。这道题的处理方法是先把当前节点的值用下一个节点的值覆盖了,然后我们删除下一个节点即可,代码如下: public void dele...
2019-07-08 20:49:13 111
原创 147. 对链表进行插入排序
/* * 直接插入排序链表 */ public ListNode insertionSortList(ListNode head) { ListNode dummy=new ListNode(-1); ListNode cur=dummy; while(head!=null) { ...
2019-07-05 17:11:59 120
原创 LeetCode 98— 验证二叉搜索树
public boolean isValidBST(TreeNode root) { if (root == null) return true; return valid(root, Long.MIN_VALUE, Long.MAX_VALUE); } private boolean valid(TreeNode root,long low,long high) { if...
2019-05-21 18:05:43 138
转载 聊聊JVM的年轻代
1.为什么会有年轻代我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出...
2019-04-28 11:04:44 108
原创 LeetCode 103—二叉树的锯齿形层次遍历
技巧:用两个栈实现不同层之间的遍历public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if (root == null) return res; Stac...
2019-04-25 21:11:41 89
原创 LeetCode 102—二叉树的层次遍历
// 递归 public List<List<Integer>> levelOrder(TreeNode root) { if (root == null) { return null; } List<List<Integer>> result = new ArrayList<>(); Queue<Tr...
2019-04-25 21:08:41 75
转载 十大经典排序算法(动图演示)
0、算法概述0.1 算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。0.2 算法复杂度0.3 相关概念稳定:如果a原本在b前...
2019-04-17 09:56:26 198
原创 LeetCode113—路径总和 II
递归:// 递归 public List<List<Integer>> pathSum(TreeNode root, int sum) { List<List<Integer>> res = new ArrayList<>(); List<Integer> out = new ArrayList<>...
2019-04-15 10:14:03 109
原创 LeetCode 112—路径总和
递归: public boolean hasPathSum(TreeNode root, int sum) { if(root==null) return false; if(root.left==null&&root.right==null&&sum==0) return true; return hasPathSum(root.left,...
2019-04-13 20:53:35 80
原创 LeetCode 101—对称二叉树
判断二叉树是否是平衡树,比如有两个节点n1, n2,我们需要比较n1的左子节点的值和n2的右子节点的值是否相等,同时还要比较n1的右子节点的值和n2的左子结点的值是否相等,以此类推比较完所有的左右两个节点。我们可以用递归和迭代两种方法来实现,写法不同,但是算法核心都一样。1.递归解法:public boolean isSymmetric(TreeNode root) { if (roo...
2019-04-03 14:36:28 113
原创 LeetCode 226—— 翻转二叉树
1.递归解法:public TreeNode invertTree(TreeNode root) { if(root==null) return null; TreeNode temp=root.left; root.left=invertTree(root.right); root.right=invertTree(t...
2019-04-03 13:22:07 112
原创 LeetCode 105—从前序与中序遍历序列构造二叉树
首先需要确定,在前序遍历中,第一个节点为根节点,则根据根节点,可以在中序遍历中划分左右子树在左右子树中,前序遍历的第一个节点为根节点,再继续划分左右子树 //根据前序遍历和中序遍历构建二叉树 public TreeNode buildTree(int[] preorder, int[] inorder) { return buildTreeCore(preorder, 0, pr...
2019-04-03 10:50:23 79
原创 LeetCode 144—二叉树的前序遍历
递归遍历:1.对递归基进行讨论2.左子树进行前序遍历3.对右子数进行前序遍历//递归实现public List<Integer> preorderTraversal(TreeNode root) { if (root == null) { return new ArrayList<>(); } List<Integer> r...
2019-03-27 12:54:13 118
原创 LeetCode 29—两数相除
利用位运算解题 public int divide(int dividend, int divisor) { if(divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1)) { return Integer.MIN_VALUE; } int sign = ((dividend...
2019-03-12 10:04:27 96
原创 LeetCode 28—实现strStr()
如果子字符串为空,则返回0如果子字符串长度大于母字符串长度,则返回-1。遍历母字符串,我们并不需要遍历整个母字符串,而是遍历到剩下的长度和子字符串相等的位置即可,这样可以提高运算效率。然后对于每一个字符,我们都遍历一遍子字符串,一个一个字符的对应比较,如果对应位置有不等的,则跳出循环,如果一直都没有跳出循环,则说明子字符串出现了,则返回起始位置即可。public int strStr...
2019-03-07 18:16:08 119
原创 LeetCode 27—移除元素
和26题的思路一样,也是设置两个指针,慢指针i用来保存数值,快指针j用来遍历数组 public int removeElement(int[] nums, int val) { int i=0; for(int j=0;j<nums.length;j++) { if(nums[j]!=val) { nums[i]=nums[j]; i++; ...
2019-03-07 15:48:10 104
原创 LeetCode 24—两两交换链表中的节点
两两合并节点,头结点的两个节点合并后,剩下的又可以转化为两两合并的子问题,所以递归求解即可。public ListNode swapPairs(ListNode head) { if(head==null||head.next==null) { return head; } ListNode left=head; ListNode...
2019-03-05 16:33:27 89
原创 LeetCode 22—括号生成
只有在我们知道序列仍然保持有效时才添加 '(' or ')'。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。用open表示左括号的个数,close表示有括号的个数。 public List<String> generateParenthesis(i...
2019-03-04 16:57:58 89
原创 LeetCode 19—删除链表的倒数第N个节点
典型的利用双指针法解题。首先让指针first指向头节点,然后让其向后移动n步,接着让指针sec指向头结点,并和first一起向后移动。当first的next指针为NULL时,sec即指向了要删除节点的前一个节点,接着让first指向的next指针指向要删除节点的下一个节点即可。注意如果要删除的节点是首节点,那么first向后移动结束时会为NULL,这样加一个判断其是否为NULL的条件,若为NULL...
2019-02-28 20:38:14 91
原创 LeetCode 18— 四数之和
四个数无非就是加一层for循环,值得注意的是,四个数中,第一个数、第三个数、第四个数的去重处理可以直接照搬上面的代码,加一下第二个数的去重处理即可。public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> res=new ArrayLi...
2019-02-27 21:56:22 105
原创 LeetCode 17—电话号码的字母组合
public List<String> letterCombinations(String digits) { String[][] numsList=new String[][] { {"a", "b", "c"}, {"d", "e", "f"}, {"g", &q
2019-02-26 21:24:23 126
原创 LeetCode 16—最接近的三数之和
排序,和上一道题类似。把三个数求和的解就转化为两个数相加等于某个数。求解两个数相加等于某个数,用双指针法即可。不需要处理重复问题,还降低了难度。 public int threeSumClosest(int[] nums, int target) { Arrays.sort(nums); int res=nums[0]+nums[1]+nums[2]; for(in...
2019-02-25 20:09:15 92
原创 LeetCode 15— 三数之和
我们对原数组进行排序,然后开始遍历排序后的数组,这里注意不是遍历到最后一个停止,而是到倒数第三个就可以了。这里我们可以先做个剪枝优化,就是当遍历到正数的时候就break,为啥呢,因为我们的数组现在是有序的了,如果第一个要fix的数就是正数了,那么后面的数字就都是正数,就永远不会出现和为0的情况了。然后我们还要加上重复就跳过的处理,处理方法是从第二个数开始,如果和前面的数字相等,就跳过,因为我们不想...
2019-02-23 19:43:23 101
原创 LeetCode 14—最长公共前缀
public String longestCommonPrefix(String[] strs) { int index = 0; if (strs.length == 0) { return ""; } for (int i = 0; i < strs[0].length(); i++) {...
2019-02-23 17:44:44 81
原创 LeetCode 13—罗马数字转整数
我们需要用到map数据结构,来将罗马数字的字母转化为对应的整数值,因为输入的一定是罗马数字,那么我们只要考虑两种情况即可:第一,如果当前数字是最后一个数字,或者之后的数字比它小的话,则加上当前数字。第二,其他情况则减去这个数字。 public int romanToInt(String s) { int num = 0; Map<Character, Integer&g...
2019-01-17 19:53:41 106
原创 LeetCode 12— 整数转罗马数字
public String intToRoman(int num) { String res=""; int[] val=new int[] {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; String[] str=new String[] {"M", "CM", "D", "CD", ...
2019-01-17 10:36:01 99
原创 机器学习中的训练集,验证集和测试集
训练集(train set) —— 用于模型拟合的数据样本。 验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。 在神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量; ...
2019-01-16 20:50:08 3561
原创 LeetCode 10—正则表达式匹配
- 若p为空,若s也为空,返回true,反之返回false。- 若p的长度为1,若s长度也为1,且相同或是p为'.'则返回true,反之返回false。- 若p的第二个字符不为*,若此时s为空返回false,否则判断首字符是否匹配,且从各自的第二个字符开始调用递归函数匹配。- 若p的第二个字符为*,进行下列循环,条件是若s不为空且首字符匹配(包括p[0]为点),调用递归函数匹配s和去掉...
2019-01-16 15:55:39 119
原创 LeetCode 9——回文数
思路:验证回文数的思路是比较第一位和最后一位(偶数和奇数的验证条件相同)求出数字的个数,存入div中求最左边一位:num/div;求最右边一位:num%10;将已经判断相等的第一位和最后一位去掉:(num%div)/10;代码如下: public boolean isPalindromeNum(int x) { if(x<0) return false; i...
2019-01-15 20:21:20 161
原创 LeetCode 7—整数反转
public int reverse(int x) { int res=0; while(x!=0) { if(Math.abs(res)>Integer.MAX_VALUE/10) return 0; res=res*10+x%10; x=x/10; } return res; ...
2019-01-10 20:13:26 84
原创 LeetCode 6—Z 字形变换
这道题就是看坐标的变化。并且需要分块处理。 n=2时,字符串坐标变成zigzag的走法就是: 0 2 4 6 1 3 5 7 n=3时的走法是: 0 4 8 1 3 5 7 9 2 6 10 n=4时的走法是: 0 6 12 1 5 7 ...
2019-01-09 21:19:08 112
原创 马拉车算法
1、字符之间插入特殊字符回文串的中心点有两种,如果长度为奇数,则回文串中心为最中间的那个字符,如 “aba” 的 “b”;如果长度为偶数,则回文串中心为最中间的两个字符的分界,如 “abba” 的 “bb”。为了统一,马拉车算法首先将字符串的每个字符之间(包括首尾两端)插入一个特殊符号,如#,这个符号必须是原字符串中所没有的。比如我们的原字符串为 s = "google"那么插入#...
2019-01-09 19:42:34 2173
原创 LeetCode 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]则中位数是 (...
2018-12-17 20:10:55 768
原创 LeetCode 3—无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是“b”,所以其长度为1。示例 3:输入: "pwwkew"输出: 3解释:...
2018-12-13 20:36:34 98
原创 LeetCode 1—两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例: 给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1] ...
2018-12-09 21:12:21 104
原创 LeetCode 94—二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [1,3,2]进阶: 递归算法很简单,你可以通过迭代算法完成吗?递归:public...
2018-11-28 20:41:21 120
原创 LeetCode 215—数组中的第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 ≤ 数组的长度。排序算...
2018-11-26 22:07:24 82
原创 LeetCode 33—搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2]...
2018-11-26 16:32:30 109
原创 LeetCode 148—排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5归并排序(MERGE-SORT)是建立在归并操作上的一
2018-11-22 21:39:06 97
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人