05 2018 档案
摘要:最大化最小值的问题。 方法一:直接做,顺便复习一下迭代器和lower_bound的用法。 方法二:分别计算每个house左面和右面距离最近的heater。时间复杂度比上述要低。学习一下 *max_element 和 *min_element 的用法。
阅读全文
摘要:class Solution { public: int findTargetSumWays(vector& nums, int S) { return cal(0,0,nums,S); } int cal(int index, int sum, vector &nums, int S){ if (index==nums.size...
阅读全文
摘要:第一想法是建一个unordered_set,时间复杂度O(m+n),空间复杂度O(m)或O(n) 更巧妙的方法是用两个指针,分别指向两个list。当遍历结束时,指向另一个list的head。两个指针的相遇点就是intersection开始的地方。空间复杂度O(1)。 unordered_set Tw
阅读全文
摘要:准备dropbox的时候又仔细看了看这道题。本题的难点一是in place,二是如果board很大或者无限大怎么办。 Naive In Place 由于状态用一位表示即可,因此利用两位(two bits)就可以同时记录之前的状态和新状态,进而不用新建一个board。 低位是原来的状态,高位是新状态。
阅读全文
摘要:可以to_string转换成string做。 不转换成string的话,计算出反转后一半的数即可。
阅读全文
摘要:LeetCode 3. Longest Substring Without Repeating Characters 典型的Sliding Window的问题,维护一个不重复的最长字串的区间。每次加入一个新元素,并维护区间性质。 class Solution { public: int length
阅读全文
摘要:二分的原理是利用区间内值有序的特点, 不断让可行区间减半, 最终可行区间长度减到1得到答案 要保证二分能得到正确答案并且不会死循环, 要保证两个条件: 1. 解一直在候选区间里2. 每次判断后可行区间都会缩小(特别是左右端点相距为1的时候) 所以写二分的时候,一定要测试只有两个点时,不同情况下区间是
阅读全文
摘要:直接做 one-pass,一边找最低的价格,一边找最大的gap,就是我们最大的profit。 Kadane's Algorithm 同样是 Kadane's Algorithm,另一种理解思路: 和53题最大子串和一样的题目,把买入到售出当做一个子序列想就一模一样了。DP方程如下: f[i]:以a[
阅读全文
摘要:方法一:DP 以前做OJ的时候都想不通为什么是DP,现在终于搞明白了。 一开始想的时候,想着 dp[i] 为下标0~i元素最大的字串和。 dp[i] = max { dp[i-1] a[i]不在subarry中 dp[i-1]+ a[i] 在subarray中 承接之前的subarray a[i]
阅读全文
摘要:典型dfs题,按照框架写。由于之前刚做了200和694,dfs写的很顺手。不同于前两道,dfs需要返回布尔值,因此代码上有些许差异,但总体结构是一样的。 递归终止条件都写在了最前面。
阅读全文
摘要:典型的搜索问题。694是200的拓展,多了怎么保存岛屿的特征的问题。两道题既可以用DFS做,也可以用BFS做。 解题中用到了 pair<int, int> 和 make_pair(i, j) 来记录坐标,相较于自己创建一个结构体,更加方便。auto关键字,用于申明类型,类型会自动推断,如果类型比较复
阅读全文
摘要:深搜和回溯本质都是递归,递归写起来不难,总结一下递归的框架方便写出优美的代码。 回溯法的基本思想: 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解
阅读全文
摘要:Given an integer n, return the number of trailing zeroes in n!. 思路: 阶乘末尾有多少零,取决于结果中有多少个10。而又多少个10又取决于结果中有多少个5(2的数量是远大于5的,因此数5的数量即可)。 数5的个数直接n/5即可,但是要注
阅读全文

浙公网安备 33010602011771号