![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
qiexingqieying
这个作者很懒,什么都没留下…
展开
-
Different Ways to Add Parentheses 不同的添加括号的方式
如何给表达式添加不同的括号,得出相应的结果。这题的思想跟计算不同的二分搜索树的思想是一样的。需要将一个大问题分解成部分的小问题。举个例子:Input: "2*3-4*5"(2*(3-(4*5))) = -34((2*3)-(4*5)) = -14((2*(3-4))*5) = -10(2*((3-4)*5)) = -10(((2*3)-4)*5) = 10将这个计算原创 2016-06-09 12:21:29 · 218 阅读 · 0 评论 -
Unique Binary Search Trees II 构造出所有的二分搜索树
如果对Unique Binary Search Trees 不熟悉的,请先看我之前的post.在这里,我们不仅要计算出不同的二分树的个数,还需要构造出所有符合要求的二分树。回忆之前的迭代细节:count(n) = count (0) + count(n - 1 - 0) + .. + count(i) + count(n - 1 - i) + .. + count(n - 1)原创 2016-06-08 19:30:19 · 220 阅读 · 0 评论 -
Unique Binary Search Trees 计算二分搜索树的个数
给一个n,n为节点的个数,计算有多少个不同的二分搜索树。(比如当n = 3的时候,树的节点共3个,分别为1, 2, 3)这个问题的关键就是如何把一个大的问题,转化成子问题,这也正是动态规划问题的核心所在。首先,我们看一下,当n = 3的时候的树。 1 3 3 2 1 \ / / / \ \原创 2016-06-08 18:24:25 · 274 阅读 · 0 评论 -
Kth Smallest Element in a BST 找二叉搜索树中的第k小的元素
一个容易想到的想法是基于二叉树,只要对二叉树进行中序遍历,序列中第k个元素就是想要找的第k小的元素。在这里,我还会介绍另一解法。基于binar search的,这个方法的效率更高。解法1:中序遍历。中序遍历可以通过递归的方式,也可以通过迭代的方式。基本思想就是当我已经输出到第k个元素了,我就可以直接返回这个元素了,后面的遍历不需要再进行了。代码:就是在之前的中序遍历上进行修改,原创 2016-06-08 16:15:02 · 634 阅读 · 0 评论 -
Binary Tree Postorder Traversal 二叉树的后序遍历(迭代非递归版本)
下面来讲讲迭代版本的二叉树后序遍历。首先,我们先来造一个二叉树,先自己模拟一下后序遍历。为了便于理解,我在之前的中序遍历的树上进行了扩展。原创 2016-06-08 14:08:58 · 449 阅读 · 0 评论 -
Binary Tree Inorder Traversal 二叉树的中序遍历(迭代非递归版本)
二叉树的遍历如果用递归的话,是比较好做的。这里,选择有挑战一点的解法:迭代直接求解。首先,我们先造一个二叉树。原创 2016-06-08 12:59:07 · 607 阅读 · 0 评论 -
Validate Binary Search Tree 判断是否是合法的二分搜索树
首先:理解下什么是二分搜索树,这个节点的左子树中节点的key 这个节点的右子树种的节点的key > 这个节点key。同时左右子树必须也是二分搜索树。Given a binary tree, determine if it is a valid binary search tree (BST).Assume a BST is defined as follows:原创 2016-06-08 10:56:51 · 544 阅读 · 0 评论 -
Linked List Cycle 判断链表是否有环,如果有环,找到环的入口
要求,空间复杂度为O(1)。判断链表是否有环是一个经典的用双指针来解决的问题。一个慢指针一次走一步,一个快指针一次走两步,如果有环的话,它们最终会在环内相遇;如果没有环的话,最终快指针会先到达链表的尾部。复杂度:时间复杂度:O(n)空间复杂度:O(1)代码: public boolean hasCycle(ListNode head) { if原创 2016-06-08 09:51:20 · 452 阅读 · 0 评论 -
287. Find the Duplicate Number 找到重复出现的数
题目:给定n+1个数,这个数的范围在1 ~ n间(包括1, n ) 且,有且仅有一个重复的数。找到这个重复的数。(重复的数可以出现很多次,但只有一个重复的数)一看这个题目:感觉方法是很多的,可以hash, 可以交换排序等。但题目又给了很多约束条件:1. 不能更改array2. 只允许O(1)空间复杂度3.时间复杂度不超过O(n^2)有了这些约原创 2016-06-07 21:07:48 · 359 阅读 · 0 评论 -
41. First Missing Positive 找到第一个缺失的正整数
给一个未排序的整数序列:找出第一个缺失的正整数。Given [1,2,0] return 3, and [3,4,-1,1] return 2.分析:我们可以忽略到那些这道题如果是不重复的序列的话,也可以用位操作进行计算。要注意现在是有重复的。为了找出缺失的,我们先将每个元素都放到一个属于他们的位置上去。放完以后,第一次出现元素的值和所在位置不对应,就可以找到缺失的值。如何定义原创 2016-06-07 16:04:52 · 345 阅读 · 0 评论 -
268. Missing Number 找出缺失的数
题目:从0, 1, 2, ..., n 选出不同的n个数,找出未选中的哪一个。Given nums = [0, 1, 3] return 2.分析:0,... n 中有 n + 1个数, 所以有一个数没有选中。原创 2016-06-07 14:55:54 · 282 阅读 · 0 评论 -
260. Single Number III 找出只出现特定次数的数 系列3
题目:在数组中,所有的元素都出现2次,除了某2个元素只出现一次,找出这2个只出现一次的元素。Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].分析:1. 记出现一次的元素为A, B 一个很自然的想法就是选对所有元素进行异或,那么出现2次元素都可以用异或消掉,所以最后剩下 A xor B 的结果,记结果为 R,原创 2016-06-07 14:16:15 · 293 阅读 · 0 评论 -
一种通用的SingleNumber问题解法
题目:给一个integer数组,每个元素出现3次,除了某个元素,找只出现一次的元素。对于这个问题,我们希望元素出现了k次(这里为3),就变成0。那么剩下的,就是我们要找的元素。所以,我们的目标就是,如何能让某个元素累计出现了k次,就变成0。原创 2016-06-07 11:31:30 · 584 阅读 · 0 评论 -
136. Single Number 找出只出现特定次数的数
题目:给一个integer数组,每个都元素出现2次,除了某个元素,找只出现一次的元素。利用异或的原则,原创 2016-06-07 11:24:19 · 336 阅读 · 0 评论 -
Maximal Rectangle 最大的矩形面积
有一个两维的矩阵,里面的值是 '0' 和 '1',找到面积最大的里面的值都是'1'的矩阵。11010001101110011111011111011001101假设我们的矩阵长这样。如何能找到面积原创 2016-06-10 12:39:00 · 500 阅读 · 0 评论 -
Longest Palindromic Substring 最长回文子串
寻找回文子串,我们可以从某个index开始,向左边,右边扩展当s[index - 1] == s[index + 1] 的时候,可以继续扩展下去。注意:我们现在只考虑了奇数长度的回文序列的情况。它也可能是"bb"这种偶数的回文序列。所以我们要考虑s[index] == s[index + 1],如果可以,再向两边扩展。代码:public class LongestP原创 2016-06-10 16:07:07 · 247 阅读 · 0 评论 -
Maximal Square 面积最大的正方形
给一个2维的矩阵,里面的值为‘0’,‘1’, 找到都是1的最大的正方形的面积。这是一道可以用动态规划来解决的问题。1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0比如这个矩阵的最大的正方形的边长为2,返回面积4.我们将某个坐标 (i, j )下能够构成的正方形的边长记为cache[ i ] [ j ]。我们先来看 (0,0), (0,1原创 2016-06-10 13:45:18 · 397 阅读 · 0 评论 -
Largest Rectangle in Histogram 直方图中最大的矩形
如图的直方图的高度为[2, 1, 5, 6, 2, 3] ,每个bar的宽度为1, 能够形成的最大面积的矩形为 2 * 5 = 10。在这里我会介绍2种解法,一种是很直观的时间复杂度为O(n2)的解法,另一种是很巧妙地利用了栈的时间复杂度O(n)的解法。对于每个长条(bar),我们将它看成是矩形中最小长度的长条。对于每个长条,我们都能计算出该长条下,最大的面积。所以,最终我们能原创 2016-06-10 11:29:37 · 575 阅读 · 0 评论 -
Binary Search Tree Iterator 设计一个二分搜索树的迭代器
在调用next()的时候,返回下次个最小的值。调用hasNext() 要返回还有没有这样的数。时间复杂度要保证在O(1), 空间复杂度要在O(h), h是树的高度。一个很直观的想法就是,要获得二分搜索的从小到大的序列,只要对树进行中序遍历就可得。中序遍历后,就得到从小到大的序列了,每次调用next,就返回index++下的值。这里有的一个限制就是空间复杂度,前面讲的原创 2016-06-08 16:54:38 · 384 阅读 · 0 评论 -
Binary Tree Preorder Traversal 二叉树的前向遍历(迭代非递归版本)
二叉的前向遍历,即先输出当且节点的值,再遍历左子树,右子树。同样的,先来造一个二叉树。原创 2016-06-08 14:44:08 · 400 阅读 · 0 评论 -
Leetcode-- ZigZag Conversion
首先要明白什么是ZigZag以题目中的"PAYPALISHIRING"为例P A H NA P L S I I GY I R是在走向垂直往下,再倾斜往上的P A H NA P L S I I GY I R所以可以看出在交替着走红色的路和绿色的路。红色的路是顺着的,绿色的路是逆着的。在写代码的时候特别要注意i原创 2016-06-11 10:15:44 · 201 阅读 · 0 评论 -
Leetcode-- String to Integer (atoi)
将String转换成Integer,这个转换的方式跟之前的reverse integer非常的像。下面讲讲重点要注意的几个方面。1. 首尾的空白符号要忽略掉。2. 处理一开始的符号问题。3. 处理溢出问题。4. 处理好在parse的时候,遇到非法的字符(即不是digit)的问题 ( 碰到了就返回当前parse的结果)。代码: public int my原创 2016-06-11 12:44:22 · 285 阅读 · 0 评论 -
Leetcode-- Reverse Integer 倒转整数
看题目中给的例子:Example1: x = 123, return 321Example2: x = -123, return -321我们可以结合取余数(%),和 /10 的操作写出初级版的代码。在这初级版的代码,考虑了x为负数的时候。代码: public int reverse(int x) { int result = 0;原创 2016-06-11 10:34:19 · 278 阅读 · 0 评论 -
Edit Distance 编辑距离
编辑距离是一道经典的动态规划(dynamic programing)问题。下面将详细地介绍解法。我们先定义一下cache[ i ][ j ] ,表示,要将word1[0...i - 1] 转化成word2[0..j - 1] 的最小步骤。比如,我们的word1 = "aeee" world2 = "adef" ""adef原创 2016-06-10 17:00:29 · 245 阅读 · 0 评论 -
Longest Substring Without Repeating Characters 最长不重复的子串
最长不重复的子串问题,这个子串是没有重复字符的,且是连续的。先看一些例子,有助于我们对这个问题的理解。Given "abcabcbb", the answer is "abc", which the length is 3.Given "bbbbb", the answer is "b", with the length of 1.Given "pwwkew原创 2016-06-10 15:07:44 · 258 阅读 · 0 评论 -
Leetcode-- Palindrome Number 回文数
判断一个数是不是回文数,不能使用额外存空间。如果是string的话,可以首尾进行判断,但因为是integer, 要获得某一个特定位上的数值是不容易的。在这里,我们将原来的input,进行翻转(不熟悉可以看下reverse integer这道题的post)。然后判断reverse的integer是否和原来的integer相等。关于overflow问题:如果如果一个数是回文数,那么原创 2016-06-11 14:43:23 · 265 阅读 · 0 评论 -
4Sum 找出满足要求的4元组
现在是需要找出4元组的了 a + b + c + d = target。思想还是跟3Sum的做法一样。注意重复的问题。我们先确定 a = nums[ i ], b = nums[ j ] ,然后在后面的数组中,用nums[ lo ] 和 nums[ hi ]逼近我们想要的 c 和 d。原创 2016-06-12 13:23:38 · 207 阅读 · 0 评论 -
3Sum 找出数组中的三元组,满足三元组之和为0
需要我们找出 sum = 0 的三元组。这题的难点是如何找出不重复的三元组(a, b, c)。做法是先将array进行排序。我们让a 为最小的,接着让 b 为 a 的后一个,让c 为最大的哪一个,两端进行逼近。原创 2016-06-12 12:56:15 · 1356 阅读 · 0 评论 -
Two Sum 计算两数和是否满足目标
先来看看给的例子:Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].如果有满足target = 9的,就返回下标。解法1:我们先可以有一个很直接的解法:遍历数组中每个一个元素A,再看它后面的元素B ,A + B 是否等于t原创 2016-06-12 11:08:52 · 409 阅读 · 0 评论 -
Add Two Numbers 将2个以链表形式表示的数相加
如例子中的:2 + 5 = 74 + 6 = 10, 此时要进位3 + 4 + 1(进位的) = 8我们设2个指针,curL1遍历第一个链表, curL2 遍历第二个链表。需要注意的有3点:1. 进位的问题原创 2016-06-12 16:01:48 · 351 阅读 · 0 评论 -
Rotate Array 部分旋转数组
先介绍简单的解法1:进行观察后,可以想到一种解决方案。1. 利用额外k空间 (这里 k = 3) , 存储[5, 6, 7 ]2. 将前面的[1, 2, 3, 4] 后移k 位。此时array变成 [1, 2, 3, 1, 2, 3, 4]3. 利用存储的值,来更新array 前 k 个值,最后array变成[5, 6, 7, 1, 2, 3, 4]原创 2016-06-12 14:41:21 · 252 阅读 · 0 评论 -
3Sum Closest 找出最接近目标的三元组
这还是3Sum 问题,之前,我们是要找 = 目标的三元组。现在是接近。即我们的 “ a + b + c - target ” 是所有数组中的三元组中最小的。我们在原来的3Sum上进行改动,额外增加两个变量minDif :用来标记当前最小的差距;和 value变量,用来标记当前的形成最小差距的 a + b + c 的值 (即需要的返回值)。原创 2016-06-12 13:46:44 · 263 阅读 · 0 评论 -
Rotate List 部分旋转链表
我们先考虑通用的情况:对于k, 我们希望找到2个指针,最终能指在如图3, 5 这个位置,假设指向3的为slow, 指向5的为fast。那么,newHead = slow.next ( 4 为head了 )slow.next = null (从3这里断开了)fast.next = head; ( 5指向原来的head)这样就能形成:4->5->1->2->3->NULL 了。如何能找到这样的2个指针。我们首先要明白,这2指针的间距为k。所以:原创 2016-06-12 15:20:40 · 543 阅读 · 0 评论 -
Remove Nth Node From End of List 从链表中删除元素
从链表中删除,以链表尾部开始数过来的第n个数。我们利用双指针策略,fast指针和slow指针。这样只要遍历一次链表,就可以完成删除。1. fast指针先走 n 步后,2. fast指针和slow指针一起走,直至fast.next = null3. 当fast.next = null的时候,此时slow 在 3这个地方 slow.next = slow.next.next就可以把4消除掉了。唯一需要注意的问题:原创 2016-06-12 16:37:11 · 169 阅读 · 0 评论 -
Merge Sorted Array 归并2个数组
我们需要明白,nums1中是有足够的空间,归并后的结果的。在这里我讲介绍2种解法,一种是我最初想到过的空间复杂度为O ( m ) 的解法。另一种是比较好的inplace的解法。两者的时间复杂度都是O(m + n )原创 2016-06-12 19:08:46 · 218 阅读 · 0 评论 -
Insertion Sort List 链表的插入排序
插入排序是假设前面一部分已经是有序的,后面A 不满足有序,则寻找前面有序序列的合适的位置,插入A。插入排序默认第一个是有序状态。假设我们有3 -> 5 -> 4 ->1 -> 2这样一个链表。3有序cur = 5 : 5 > 3,有序cur = 4 : 4 < 5, 无序,需要进行插入操作。从头开始找合适的插入位置:原创 2016-06-12 20:47:44 · 236 阅读 · 0 评论 -
Sort List 链表排序
这里,依旧利用分治的思想,更具体点就是归并排序的算法。假设list 的前一半已经排好序的,后一半也已经排好序了,那么将这2 Merge起来(如果不知道怎么Merge,可以看我前面的博文)那么具体list的前一半怎么排序呢?也是拆分成2部分。原创 2016-06-12 19:45:22 · 390 阅读 · 0 评论 -
Merge k Sorted Lists 归并k个链表
假设大家已经熟悉2个链表如何归并了。在这里我讲介绍2种方法归并k个链表,这两种方法的复杂度都是O(nlogk) (n 为所有节点的个数)第一种是基于分治思想的递归法。第二种是基于PriorityQueue的。第一种是基于分治思想的递归法。第二种是基于P原创 2016-06-12 18:12:33 · 173 阅读 · 0 评论 -
Merge Two Sorted Lists 归并list
思考:这道题目没有什么特别要注意的。2个指针l1, l2 分别指向链表具体分别两部分:1. l1 != null && l2 != null两两进行进行比较原创 2016-06-12 17:33:08 · 153 阅读 · 0 评论 -
Sort Colors 颜色排序(只有3类值的排序)
这个问题实质上就是对于0, 1, 2的序列进行排序。由于只有3类值。我们可以实现一个时间复杂度为 O ( n ) , 空间复杂度为 O ( 1 )的算法。核心的思想是:将0 的全都放到left边, 将2 的全都放到right边,最后,就是排好序的了。为了实现这个思想,原创 2016-06-12 21:37:34 · 464 阅读 · 0 评论