leetcode 338. Counting Bits

2018-03-25
阅读 2 分钟
3.2k
这里除了暴力的计算每个数字中含有多少个1,我们可以使用动态规划的方法来计算i中有几个1。假设我们已经知道前i-1个数字分别有多少个1,而且i中含有k个数字,那么其实很容易的想到,i中1的个数等于前k-1位构成的数字的1的个数,加上第k位1的个数,即1或是0。还有一种等价的思路是第0位的1的个数(0或是1)加上1~k位构成...

leetcode 321. Create Maximum Number

2018-03-25
阅读 3 分钟
3.2k
首先采用分治法的思路,我们知道这K个数字中,必然有i个数组来自nums1,而剩下的k-i个数字必然来自nums2。那么问题变成从nums1中获取i个数,这i个数构成的数字最大,且这i个数字的相对位置不变。再从nums2中获取k-i个数,这k-i个数构成的数字最大,且这k-i个数字的相对位置不变。

leetcode 312. Burst Balloons

2018-03-17
阅读 3 分钟
3k
这里讲了一个炸气球小游戏的规则。当我们选中一个气球并炸掉它后,会得到该气球以及其相邻两个气球的分数的乘积,并加入我们的积分。之后该气球将消失,从而其左右两个气球成为相邻的气球。问如何选择气球才能使得积分数最高。

leetcode 328. Odd Even Linked List

2018-03-17
阅读 2 分钟
2.2k
将一个链表中的节点按照奇数位上的节点在前,偶数位上的节点在后重新排序。这里需要注意的是节点之间的相对顺序不可以改变。即1->2->3->4不可以变为1->3->4->2,只能是1->3->2->4。

leetcode 300. Longest Increasing Subsequence

2018-03-14
阅读 2 分钟
3.5k
找到整数数组中最长的递增子数组。该子数组可以为不连续的。如题目中例子所示,[10, 9, 2, 5, 3, 7, 101, 18]得到的最长子数组为[2,3,7,101]。

leetcode 343. Integer Break

2018-03-14
阅读 1 分钟
2.3k
这里应用了一个数学的思路。假设我们有一个数字n,该数组可以随机分解为t和n-t。当分解为n/2时可以获得最大的乘积。因此t取n/2时可以得到最好的结果。但是这里我们明显还可以继续对t分解(如果t大于1),这样逐个分解之后终归会分解为2或者1为质因数

leetcode295. Find Median from Data Stream

2018-03-13
阅读 2 分钟
2.4k
这里采用了两个优先队列来实现。一个优先队列用来存储字符流中较小的一半,另一个用来存储字符流中数值较大的一半。这样当需要获取当前中位数时,就可以根据当前的数值个数选择一个或是两个数的平均值。

leetcode318. Maximum Product of Word Lengths

2018-03-13
阅读 2 分钟
2k
这道题的重点在于如何优化字符串的比较。直观的来说,我们无法避开复杂度为O(n^2)的循环因为必须进行两两比较才能识别出最大的乘积。但是我们可以优化字符串的比较。

leetcode 319. Bulb Switcher

2018-03-13
阅读 2 分钟
1.8k
一共有n个初始状态为关闭的灯泡。第一次打开所有灯泡,第二次每隔一个灯泡关闭一个灯泡,第三次每隔两个灯泡按一下开关。依次类推,问第n次之后开着的灯泡的数量有几个?

leetcode 301. Remove Invalid Parentheses

2018-03-12
阅读 3 分钟
4.5k
现在有一个字符串包含一些左右括号以及字母。一个合法的字符串是指左括号和右括号必定成对出现。要求得出用最少次数的删除可以得到的所有的合法字符串。

leetcode322. Coin Change

2018-03-12
阅读 3 分钟
2.5k
这题本质上考察的是动态规划思想。这里有两种动态规划的方法,分别从递归和非递归的角度解决这个问题。具体的情况还是要看数据的分布情况来确定选择哪种方法。

leetcode307. Range Sum Query - Mutable

2018-03-08
阅读 5 分钟
2.7k
最开始我们有两种直观的想法,一种是在插入时同时更新后面所有的和,这意味着O(n)的插入复杂度和O(1)的读取复杂度。我决定选择第二种方式,也就是采用类似日志的形式记录下每一次的变更。这样当我们读取的时候,再遍历日志,将相关的变更结果添加到当前的数值上。缺点是,变更很多以及数组很庞大时,效率依然很差。

leetcode303-304 Range Sum Query Immutable

2018-03-07
阅读 3 分钟
2.3k
这一题思路很简单,因为sum[i-j] = sum[0~j] - sum[0~(i-1)]。我们只需要通过一圈遍历计算出每个下标至0的所有数字的和即可。而利用动态规划则很容易知道sum[0~j] = sum[0~j-1] + num[j]。

leetcode494. Target Sum

2018-03-05
阅读 3 分钟
2.4k
直观的来说,我们可以将所有的情况都尝试一遍并且将可能构成结果的集合统计下来。就以题目中例子来说,原始的输入为[1,1,1,1,1],目标值为3。那么我们假设先给第一个值设置为正数,则只需要知道[1,1,1,1]组合成目标值2的集合个数即可。通过不断的递归调用,当遍历到数组的尽头时,我们只需要知道当前的目标值是否为0,如...

leetcode297. Serialize and Deserialize Binary Tree

2018-03-04
阅读 3 分钟
2.4k
设计一个方法将一个二叉树序列化并反序列化。序列化是指将对象转化成一个字符串,该字符串可以在网络上传输,并且到达目的地后可以通过反序列化恢复成原来的对象。

leetcode289. Game of Life

2018-03-04
阅读 4 分钟
1.7k
这个内容在维基百科上讲述的非常详细,有图文示例。这个游戏玩家在游戏开始后是不能操作的,完全是由最初的状态来决定最终的结果。板上的每个小格子有两种状态,live或dead。而根据游戏规则,每一次这个板上的内容将会随着前一次板上的内容发生变化。变化的规则如下:

leetcode140. Word Break II

2018-03-02
阅读 2 分钟
2.5k
现在有一个非空字符串s和一个非空的字典wordDict。现在向s中添加空格从而构成一个句子,其中这个句子的所有单词都存在与wordDic中。字典中不包含重复的单词。

leetcode135. Candy

2018-02-28
阅读 2 分钟
2.4k
题目要求 {代码...} 假设有N个孩子站成一排,每个孩子拥有一个评估值。现在要根据以下的需求给孩子们分发糖果: 每个孩子至少有一颗糖 有更高评估值的孩子应当比两侧孩子得到的糖更多 问最少要发出多少颗糖? 思路和代码 这里我们可以举一个例子来先试着分配一下:假设有10个孩子,每个孩子对应的评估分别是[3,4,5,7,2,3...

leetcode241. Different Ways to Add Parentheses

2018-02-25
阅读 4 分钟
2.5k
这是经典的分治法。我们将算式从一个操作符的位置分割开,并分别得出左边和右边算式所有可能的值。再将左右的值分别按照操作符进行计算。这里通过递归实现。

leetcode239. Sliding Window Maximum

2018-02-25
阅读 3 分钟
2k
假设有一个数组和一个长度为k的窗口,1 ≤ k ≤ 数组长度。这个窗口每次向右移动一位。现在问该窗口在各个位置上,能够得到的子数组的最大值是多少?

leetcode279. Perfect Squares

2018-02-24
阅读 3 分钟
2.8k
我们可以用另一种思路来拆解n:比如:numSquares(1) = 1;numSquares(2) = numSquares(1)+1numSquares(3) = numSquares(3-1*1) + 1numSquares(4) = 1numSquares(5) = min(numSquares(5-1*1)+1, numSquares(5-2*2)+1)numSquares(10) = min(numSquares(10-1*1)+1, numSquares(10-2*2)+1, numSquares(10-3*3)+1)

Leetcode188. Best Time to Buy and Sell Stock IV

2018-02-24
阅读 2 分钟
2.1k
这里采用了动态编程的思想。假设我们希望得到第j天最多进行i次交易的最大利润,我们首先想到的是,可以通过比较第j-1天最多进行i次交易的利润,以及第j-1天进行i-1次交易然后最后一次交易为卖出当天的股票所带来的利润。

leetcode164. Maximum Gap

2018-02-23
阅读 2 分钟
1.9k
这里并不需要完全的进行排序。我们只需要找到合适的区间划分,并将各个数字丢到其所属的区间中。之后,我们只需要比较前一个区间的最大值和后一个区间的最小值之间的差距即可以获得该数组最大的间隔。

leetcode260. Single Number III

2018-02-23
阅读 2 分钟
1.7k
题目要求 {代码...} 假设一个整数数组中,除了两个数字以外,所有的数字都出现了两遍。要求我们找到这两个数字。 可以先参考Single Number I 和 Single Number II。 思路与代码 这里需要了解两个位运算的重要知识: a^b^b = a 即b^b=0 a&(-a)能够获得a的二进制形式的最右侧的1的位置。 举例解释一下第二个位运算:一...

leetcode 240. Search a 2D Matrix II

2018-02-11
阅读 4 分钟
2.4k
直观的来看我们肯定会从左上角开始判断,如果当前的值比目标值大,那么结束返回该值不存在,而如果当前的值比目标值小,则我们顺着行或是列继续查找。代码如下:

leetcode263,264,313 ugly numbers

2018-02-09
阅读 5 分钟
2.4k
丑数是指只包含2,3,5质因数的数。因此6,8是丑数因为6=2*3,8=2*2*2,而14不是丑数因为14包含质因数7。现在写一个方法判断一个数字是否是丑数。

leetcode231. Power of Two

2018-02-04
阅读 1 分钟
1.6k
当我们从二进制的角度来看,这个题目就非常简单了。其实题目的要求等价于该整数对应的二进制数中,一共有几个1。该题目的难点在于考虑边界情况,比如-2^32,即10000000000000000000000000000000。虽然它只有一个1,但是它不是2的幂。

leetcode201. Bitwise AND of Numbers Range

2018-02-04
阅读 2 分钟
1.9k
给一个闭区间[m,n],对该闭区间的所有数字进行与(and)运算。与预算是指 1 and 1 = 0, 1 and 0 = 0, 0 and 1 = 0, 0 and 0 = 0。这里都是以二进制为基础进行与运算。在计算机底层所有的十进制数都是以二进制数进行存储的。写这道题目之前需要先去了解十进制转二进制以及未操作符>>,>>>和<<。

leetcode235-236 lowest common ancestor

2018-01-10
阅读 3 分钟
2.3k
现在有一棵搜索二叉树,这个二叉树的特点是左子树的节点一定小于根节点,而右子树的节点一定大于根节点。现在提供这棵树的根节点,并且输入两个节点,问这两个节点的最低共同父节点是谁?最低共同父节点是指两个节点在沿父节点向上爬升时遇到的第一个共同父节点,同时它也允许父节点就是其本身,比如在上图中2和4的最低...

leetcode202 Happy Number

2018-01-07
阅读 2 分钟
1.8k
实现一个算法来判断一个数字是否开心。一个开心数字是指将数字的各个位上的数求平方和,如果这个数字最终能够计算至1,那么这个数字就是一个开心数字。如果这个数字一直在某个圈中循环,那么这就不是一个开心数字。题目中也给了19这个例子。