LeetCode题解
LeetCode解题思路以及java语言代码实现
吃西瓜要吐米米
亦余心之所善兮,虽九死其犹未悔。
展开
-
LeetCode347. 前K个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]说明:你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(n log n) , n 是...原创 2018-10-17 21:37:57 · 258 阅读 · 0 评论 -
LeetCode319. 灯泡开关
初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。示例:输入: 3输出: 1 解释: 初始时, 灯泡状态 [关闭, 关闭, 关闭].第一轮后, ...原创 2018-10-15 19:29:47 · 429 阅读 · 0 评论 -
LeetCode328. 奇偶链表
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->...原创 2018-10-16 21:13:49 · 252 阅读 · 0 评论 -
LeetCode299. 猜数字游戏
你正在和你的朋友玩 猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜。每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为“Bulls”, 公牛),有多少位数字猜对了但是位置不对(称为“Cows”, 奶牛)。你的朋友将会根据提示继续猜,直到猜出秘密数字。请写出一个根据秘密数字和朋友的猜测数返回提示的函数,用 A 表示公牛,用 B 表示奶牛。请注意秘...原创 2018-10-14 20:22:57 · 1114 阅读 · 0 评论 -
LeetCode700. 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。例如,给定二叉搜索树: 4 / \ 2 7 / \ 1 3和值: 2你应该返回如下子树: 2 / \ 1 ...原创 2018-10-11 22:05:46 · 347 阅读 · 0 评论 -
LeetCode230. 二叉搜索树中第K小的元素
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 1示例 2:输入: root = [5,3,6,2,4,null,null,...原创 2018-10-12 22:44:17 · 920 阅读 · 0 评论 -
LeetCode228. 汇总区间
给定一个无重复元素的有序整数数组,返回数组区间范围的汇总。示例 1:输入: [0,1,2,4,5,7]输出: ["0->2","4->5","7"]解释: 0,1,2 可组成一个连续的区间; 4,5 可组成一个连续的区间。示例 2:输入: [0,2,3,4,6,8,9]输出: ["0","2->4","6","8原创 2018-10-10 21:40:52 · 228 阅读 · 0 评论 -
LeetCode589. N叉树的前序遍历
给定一个N叉树,返回其节点值的前序遍历。 例如,给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4]。 说明: 递归法很简单,你可以使用迭代法完成此题吗?思路:解法一:采用递归的思想遍历n叉树。/*// Definition for a Node.class Node { public int val; public...原创 2018-10-10 11:14:25 · 284 阅读 · 0 评论 -
LeetCode590. N叉树的后序遍历
给定一个N叉树,返回其节点值的后序遍历。 例如,给定一个 3叉树 : 返回其后序遍历: [5,6,3,2,4,1]. 说明: 递归法很简单,你可以使用迭代法完成此题吗?思路:采用递归的思想遍历n叉树。/*// Definition for a Node.class Node { public int val; public List&...原创 2018-10-10 13:50:40 · 178 阅读 · 0 评论 -
LeetCode222. 完全二叉树的节点个数
给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例:输入: 1 / \ 2 3 / \ /4 5 6输出: 6思路:首先想到遍历二叉树,计数所有...原创 2018-10-09 19:15:22 · 285 阅读 · 0 评论 -
LeetCode541. 反转字符串 II
给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。示例:输入: s = "abcdefg", k = 2输出: "bacdfeg"要求:该字符串只包含小写的英文字母。 给定字符串的长度和 k...原创 2018-10-09 20:24:26 · 481 阅读 · 0 评论 -
LeetCode.1求两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> v; vector<...原创 2018-04-25 10:07:06 · 230 阅读 · 0 评论 -
LeetCode13. 罗马数字转整数
罗马数字包含以下七种字符:I, V, X, L,C,D 和 M.字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做...原创 2018-04-25 10:30:40 · 390 阅读 · 0 评论 -
LeetCode14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例 1:输入: ["flower","flow","flight"]输出: "fl"示例 2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。cla原创 2018-04-25 10:34:33 · 863 阅读 · 0 评论 -
LeetCode20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例 2:输入: "()[]{}"输出: true示例 3:输入: "(]"输出: false示例 4:输入: "([)]"输出: fa...原创 2018-04-25 10:38:22 · 1512 阅读 · 1 评论 -
LeetCode21. 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4/** * Definition for singly-linked list. * struct ListNode { * int val; * ...原创 2018-04-25 10:41:00 · 133 阅读 · 0 评论 -
LeetCode26. 删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。class Solution...原创 2018-04-25 10:44:20 · 295 阅读 · 0 评论 -
LeetCode27. 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。...原创 2018-04-25 10:47:39 · 193 阅读 · 0 评论 -
LeetCode28. 实现strStr()
实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。class Solution { public int strStr(String haystack, String needle) { if(needle==nul...原创 2018-04-25 10:50:01 · 104 阅读 · 0 评论 -
LeetCode35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0class Solution...原创 2018-04-25 10:51:53 · 748 阅读 · 0 评论 -
LeetCode58. 最后一个单词的长度
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0 。说明:一个单词是指由字母组成,但不包含任何空格的字符串。示例:输入: "Hello World"输出: 5class Solution { public int lengthOfLastWord(String str) { if(str==null||str...原创 2018-04-25 10:53:50 · 625 阅读 · 0 评论 -
LeetCode66. 加一
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。class Solu...原创 2018-04-26 12:39:11 · 927 阅读 · 0 评论 -
LeetCode67. 二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。示例 1:输入: a = "11", b = "1"输出: "100"示例 2:输入: a = "1010", b = "1011"输出: "10101"class Solution { public String addBinary(String a, String b) {原创 2018-04-26 12:38:20 · 515 阅读 · 0 评论 -
LeetCode83. 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3/** * Definition for singly-linked list. * public class ListNode { * int va...原创 2018-04-26 13:22:52 · 179 阅读 · 0 评论 -
LeetCode70.爬楼梯
假设你正在爬楼梯。需要 n 步你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 步 + 1 步2. 2 步示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 步 + 1 步 + 1 步2. 1 步 + 2 步3. ...原创 2018-04-26 21:07:04 · 180 阅读 · 0 评论 -
LeetCode88. 合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6],...原创 2018-04-27 20:59:03 · 131 阅读 · 0 评论 -
LeetCode125. 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。解题思路:将字符串转化成只含有字母和数字的字符数组,再对字符数组进行验证。public boolean isPalindrome(String s) { if(s==null||s.length()==0) { return true; }...原创 2018-05-06 15:23:22 · 130 阅读 · 0 评论 -
LeetCode136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。解题分析:可用哈希表来存储数据 public static int singleNumber(int[] nums) { Map map=new HashMap(); for(int i=0;i<nums.length;i++) { if(map.get(nu...原创 2018-05-06 16:02:25 · 131 阅读 · 0 评论 -
LeetCode167. 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], target = 9...原创 2018-05-31 10:15:58 · 855 阅读 · 1 评论 -
LeetCode463. 岛屿的周长
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。示例 :[[0,...原创 2018-06-01 12:41:43 · 1063 阅读 · 0 评论 -
LeetCode476. 数字的补数
给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。注意:给定的整数保证在32位带符号整数的范围内。你可以假定二进制数不包含前导零位。示例 1:输入: 5输出: 2解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。示例 2:输入: 1输出: 0解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。思路:先将整数转换成二进制,二...原创 2018-06-01 12:40:52 · 582 阅读 · 0 评论 -
LeetCode225. 用队列实现栈
使用队列实现栈的下列操作:push(x) --元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() --返回栈是否为空注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许不支持队列。 你可以使用 list 或者 deque (双端队...原创 2018-06-01 12:50:42 · 740 阅读 · 0 评论 -
LeetCode234. 回文链表
请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true思路:首先找到链表的中间结点,从中间结点开始翻转链表得到两条新链表,比较两条链表的值是否一样。/** * Definition for singly-linked list. * public class ListNode { * ...原创 2018-06-01 13:04:40 · 651 阅读 · 0 评论 -
LeetCode242. 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false思路:判断给定两个字符串所含的字符在不考虑顺序的情况小是否相同,可借助两个哈希表结构来分别存储两个字符串,比较两个哈希表是否相同。class S...原创 2018-06-01 13:11:03 · 243 阅读 · 0 评论 -
LeetCode257. 二叉树的所有路径
给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3思路:深度优先遍历二叉树,在遍历过程中将每个节点的值存储下来,遍历到叶子结点时,将一路遍...原创 2018-06-01 13:19:04 · 732 阅读 · 0 评论 -
LeetCode258. 各位相加
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。示例:输入: 38输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。思路:class Solution { public int addDigits(int num) { while(num>=10) { num=(...原创 2018-06-05 09:11:44 · 359 阅读 · 0 评论 -
LeetCode268. 缺失数字
给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。示例 1:输入: [3,0,1]输出: 2示例 2:输入: [9,6,4,2,3,5,7,0,1]输出: 8思路:由于从0~n缺失了一位数,从0~n构建一张哈希表,初始的value都为0,遍历数组,为哈希表的键赋值。最后找出value=0的键就是缺失的数字。class Solut...原创 2018-06-01 13:28:03 · 247 阅读 · 0 评论 -
LeetCode283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。思路:class Solution { public void moveZeroes(int[] nums) { if(nums==null) ...原创 2018-06-05 09:08:16 · 167 阅读 · 0 评论 -
LeetCode290. 单词模式
给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式。示例1:输入: pattern = "abba", str = "dog cat cat dog"输出: true示例 2:输入:pattern = "abba", str = "do...原创 2018-06-01 13:47:08 · 1126 阅读 · 0 评论 -
LeetCode344. 反转字符串
请编写一个函数,其功能是将输入的字符串反转过来。示例:输入:s = "hello"返回:"olleh"class Solution { public String reverseString(String s) { if(s==null) { return null; } int len=s.length(); char[] ch=...原创 2018-06-02 15:15:43 · 1146 阅读 · 0 评论