
LeetCode
liushiqi0826
这个作者很懒,什么都没留下…
展开
-
LeetCode 94—二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3输出: [1,3,2]进阶: 递归算法很简单,你可以通过迭代算法完成吗?递归:public...原创 2018-11-28 20:41:21 · 132 阅读 · 0 评论 -
LeetCode 22—括号生成
只有在我们知道序列仍然保持有效时才添加 '(' or ')'。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括号。用open表示左括号的个数,close表示有括号的个数。 public List<String> generateParenthesis(i...原创 2019-03-04 16:57:58 · 102 阅读 · 0 评论 -
LeetCode 26— 删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。示例2:给定 nums = [0,...原创 2018-10-10 20:55:55 · 102 阅读 · 0 评论 -
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 · 115 阅读 · 0 评论 -
LeetCode 28—实现strStr()
如果子字符串为空,则返回0如果子字符串长度大于母字符串长度,则返回-1。遍历母字符串,我们并不需要遍历整个母字符串,而是遍历到剩下的长度和子字符串相等的位置即可,这样可以提高运算效率。然后对于每一个字符,我们都遍历一遍子字符串,一个一个字符的对应比较,如果对应位置有不等的,则跳出循环,如果一直都没有跳出循环,则说明子字符串出现了,则返回起始位置即可。public int strStr...原创 2019-03-07 18:16:08 · 132 阅读 · 0 评论 -
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 · 109 阅读 · 0 评论 -
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 · 134 阅读 · 0 评论 -
LeetCode 105—从前序与中序遍历序列构造二叉树
首先需要确定,在前序遍历中,第一个节点为根节点,则根据根节点,可以在中序遍历中划分左右子树在左右子树中,前序遍历的第一个节点为根节点,再继续划分左右子树 //根据前序遍历和中序遍历构建二叉树 public TreeNode buildTree(int[] preorder, int[] inorder) { return buildTreeCore(preorder, 0, pr...原创 2019-04-03 10:50:23 · 89 阅读 · 0 评论 -
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 · 122 阅读 · 0 评论 -
LeetCode 101—对称二叉树
判断二叉树是否是平衡树,比如有两个节点n1, n2,我们需要比较n1的左子节点的值和n2的右子节点的值是否相等,同时还要比较n1的右子节点的值和n2的左子结点的值是否相等,以此类推比较完所有的左右两个节点。我们可以用递归和迭代两种方法来实现,写法不同,但是算法核心都一样。1.递归解法:public boolean isSymmetric(TreeNode root) { if (roo...原创 2019-04-03 14:36:28 · 123 阅读 · 0 评论 -
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 · 92 阅读 · 0 评论 -
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 · 92 阅读 · 0 评论 -
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 · 99 阅读 · 0 评论 -
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 · 123 阅读 · 0 评论 -
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 · 161 阅读 · 0 评论 -
LeetCode 237-删除链表中的节点
这道题让我们删除链表的一个节点,更通常不同的是,没有给我们链表的起点,只给我们了一个要删的节点,跟我们以前遇到的情况不太一样,我们之前要删除一个节点的方法是要有其前一个节点的位置,然后将其前一个节点的next连向要删节点的下一个,然后delete掉要删的节点即可。这道题的处理方法是先把当前节点的值用下一个节点的值覆盖了,然后我们删除下一个节点即可,代码如下: public void dele...原创 2019-07-08 20:49:13 · 126 阅读 · 0 评论 -
LeetCode 23—合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入: [ 1->4->5, 1->3->4, 2>6 ]输出: 1->1->2->3->4->4->5->6用到类似于数...原创 2018-11-12 15:49:23 · 92 阅读 · 0 评论 -
147. 对链表进行插入排序
/* * 直接插入排序链表 */ public ListNode insertionSortList(ListNode head) { ListNode dummy=new ListNode(-1); ListNode cur=dummy; while(head!=null) { ...原创 2019-07-05 17:11:59 · 141 阅读 · 0 评论 -
LeetCode 21—合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode du...原创 2018-11-06 21:48:52 · 125 阅读 · 0 评论 -
LeetCode 20—有效的括号
给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例2:输入: "()[]{}"输出: true示例3:输入: "(]"输出: false...原创 2018-10-10 09:46:51 · 119 阅读 · 0 评论 -
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 · 141 阅读 · 0 评论 -
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 · 120 阅读 · 0 评论 -
LeetCode 3—无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是“b”,所以其长度为1。示例 3:输入: "pwwkew"输出: 3解释:...原创 2018-12-13 20:36:34 · 109 阅读 · 0 评论 -
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 · 116 阅读 · 0 评论 -
LeetCode 2—两数相加
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807java代码: pu...原创 2018-11-05 19:34:51 · 101 阅读 · 0 评论 -
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 · 787 阅读 · 0 评论 -
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 · 97 阅读 · 0 评论 -
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 · 113 阅读 · 0 评论 -
LeetCode 13—罗马数字转整数
我们需要用到map数据结构,来将罗马数字的字母转化为对应的整数值,因为输入的一定是罗马数字,那么我们只要考虑两种情况即可:第一,如果当前数字是最后一个数字,或者之后的数字比它小的话,则加上当前数字。第二,其他情况则减去这个数字。 public int romanToInt(String s) { int num = 0; Map<Character, Integer&g...原创 2019-01-17 19:53:41 · 116 阅读 · 0 评论 -
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 · 122 阅读 · 0 评论 -
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 · 177 阅读 · 0 评论 -
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 · 138 阅读 · 0 评论 -
LeetCode 18— 四数之和
四个数无非就是加一层for循环,值得注意的是,四个数中,第一个数、第三个数、第四个数的去重处理可以直接照搬上面的代码,加一下第二个数的去重处理即可。public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> res=new ArrayLi...原创 2019-02-27 21:56:22 · 115 阅读 · 0 评论 -
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 · 94 阅读 · 0 评论 -
LeetCode 15— 三数之和
我们对原数组进行排序,然后开始遍历排序后的数组,这里注意不是遍历到最后一个停止,而是到倒数第三个就可以了。这里我们可以先做个剪枝优化,就是当遍历到正数的时候就break,为啥呢,因为我们的数组现在是有序的了,如果第一个要fix的数就是正数了,那么后面的数字就都是正数,就永远不会出现和为0的情况了。然后我们还要加上重复就跳过的处理,处理方法是从第二个数开始,如果和前面的数字相等,就跳过,因为我们不想...原创 2019-02-23 19:43:23 · 109 阅读 · 0 评论 -
LeetCode 19—删除链表的倒数第N个节点
典型的利用双指针法解题。首先让指针first指向头节点,然后让其向后移动n步,接着让指针sec指向头结点,并和first一起向后移动。当first的next指针为NULL时,sec即指向了要删除节点的前一个节点,接着让first指向的next指针指向要删除节点的下一个节点即可。注意如果要删除的节点是首节点,那么first向后移动结束时会为NULL,这样加一个判断其是否为NULL的条件,若为NULL...原创 2019-02-28 20:38:14 · 99 阅读 · 0 评论 -
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 · 102 阅读 · 0 评论 -
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 · 101 阅读 · 0 评论 -
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 · 139 阅读 · 0 评论