随笔分类 -  LeetCode

上一页 1 ··· 5 6 7 8 9 10 下一页
摘要:求到所有点距离和最小的点。由于是麦哈顿距离,横坐标和纵坐标计算是独立的,于是问题转化为找一维数轴上到所有点距离和最小的点。 这个问题是老生常谈的问题了,如果是点的个数是奇数,答案就是中位数;如果是偶数,则最内侧两个点中间所有的数都可以是答案。两种情况都可以用 nums[nums.size()/2] 阅读全文
posted @ 2018-06-06 13:32 約束の空 阅读(118) 评论(0) 推荐(0)
摘要:每次一定是选择最小的n-1个数+1。直接做会超时。 换一种思路,对最小的n-1个数+1,等价于对最大的数-1,问题就很简单了。 阅读全文
posted @ 2018-06-06 11:36 約束の空 阅读(94) 评论(0) 推荐(0)
摘要:题目要求不能对原链表进行操作,因此直接把链表都逆过来是不行的(该问题的I问题就是逆过来的)。 但是不逆过来不好做,因此计算的时候逆过来,或者逆过来再计算。 方法一: 计算的时候逆过来:新建一个链表,在计算对应位和的时候逆过来。 方法二: 逆过来再计算:不能对原链表操作,那我们可以建立一个数组,倒序访 阅读全文
posted @ 2018-06-05 22:56 約束の空 阅读(116) 评论(0) 推荐(0)
摘要:用hash表记录每个字符的个数,开始我是新建了一个vector<pair<int,char>>然后依据个数排序。 后来发现可以直接对string排序。 其中运用了lambda表达式,利用引用捕获得到count。 关于Lambda,详见: http://en.cppreference.com/w/cp 阅读全文
posted @ 2018-06-03 15:21 約束の空 阅读(115) 评论(0) 推荐(0)
摘要:玩过极限脱出999,对数字根印象深刻。 随便一个数,假设abcd, abcd=a*1000+b*100+c*10+d =a*(1+999)+b*(1+99)+c*(1+9)+d =(a+b+c+d)+a*999+b*99+c*9 =(a+b+c+d)+9*(a*111+b*11+c) 所以abcd% 阅读全文
posted @ 2018-06-03 11:47 約束の空 阅读(105) 评论(0) 推荐(0)
摘要:136. Single Number 考察的是异或运算。相同的数异或结果为0,一个数与0异或还是原来的数,以及异或符合交换律。因此,把所有的数都异或起来,结果就是落单的那个数。 268. Missing Number 可以用数学方法直接做,求和减去数组的和就是所求答案。 用位操作来做的话,同样用异或 阅读全文
posted @ 2018-06-03 00:26 約束の空 阅读(111) 评论(0) 推荐(0)
摘要:题目核心是矩阵遍历。以前做过类似的题,不过是正方形的情况。我都是由外向内,层一个for循环,四个方向一个for循环,坐标计算相对复杂。 换一种思路,记矩阵左上角坐标(i1,j1),右下角(i2,j2)。一个大的while循环,按照四个方向遍历,缩小矩阵。其实思路和之前一样,只不过规避掉了坐标繁琐的计 阅读全文
posted @ 2018-06-02 23:34 約束の空 阅读(109) 评论(0) 推荐(0)
摘要:判断链表有没有环,用Floyd Cycle Detection算法,用两个快慢指针。 142是141的进阶,需要额外判断环的起点。 详见 https://leetcode.com/problems/linked-list-cycle-ii/solution/ 中的推导,不过里面应该是 F=(n-1) 阅读全文
posted @ 2018-06-02 18:45 約束の空 阅读(95) 评论(0) 推荐(0)
摘要:判断是否有循环的问题。 解法一:可以用hash表将出现过的值保存起来,再次出现即说明有循环。 解法二:应用Floyd Cycle Detection算法,设一个快变量一个慢变量。如果循环存在,它们一定会相遇。 阅读全文
posted @ 2018-06-02 16:28 約束の空 阅读(96) 评论(0) 推荐(0)
摘要:Search in Rotated Sorted Array Binary Search的变种。由于rotated的存在,直接A[mid]<key的判断并无法解决继续搜索哪一半边。 思路是分情况,分为左半边有序还是右半边有序,再细分是继续搜索左半侧还是右半侧。由于涉及a[mid]和a[low],a[ 阅读全文
posted @ 2018-06-01 23:02 約束の空 阅读(132) 评论(0) 推荐(0)
摘要:最大化最小值的问题。 方法一:直接做,顺便复习一下迭代器和lower_bound的用法。 方法二:分别计算每个house左面和右面距离最近的heater。时间复杂度比上述要低。学习一下 *max_element 和 *min_element 的用法。 阅读全文
posted @ 2018-05-31 17:21 約束の空 阅读(128) 评论(0) 推荐(0)
摘要: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... 阅读全文
posted @ 2018-05-31 00:37 約束の空 阅读(75) 评论(0) 推荐(0)
摘要:第一想法是建一个unordered_set,时间复杂度O(m+n),空间复杂度O(m)或O(n) 更巧妙的方法是用两个指针,分别指向两个list。当遍历结束时,指向另一个list的head。两个指针的相遇点就是intersection开始的地方。空间复杂度O(1)。 unordered_set Tw 阅读全文
posted @ 2018-05-18 13:17 約束の空 阅读(95) 评论(0) 推荐(0)
摘要:准备dropbox的时候又仔细看了看这道题。本题的难点一是in place,二是如果board很大或者无限大怎么办。 Naive In Place 由于状态用一位表示即可,因此利用两位(two bits)就可以同时记录之前的状态和新状态,进而不用新建一个board。 低位是原来的状态,高位是新状态。 阅读全文
posted @ 2018-05-17 13:52 約束の空 阅读(108) 评论(0) 推荐(0)
摘要:可以to_string转换成string做。 不转换成string的话,计算出反转后一半的数即可。 阅读全文
posted @ 2018-05-17 12:18 約束の空 阅读(83) 评论(0) 推荐(0)
摘要:LeetCode 3. Longest Substring Without Repeating Characters 典型的Sliding Window的问题,维护一个不重复的最长字串的区间。每次加入一个新元素,并维护区间性质。 class Solution { public: int length 阅读全文
posted @ 2018-05-17 10:48 約束の空 阅读(121) 评论(0) 推荐(0)
摘要:二分的原理是利用区间内值有序的特点, 不断让可行区间减半, 最终可行区间长度减到1得到答案 要保证二分能得到正确答案并且不会死循环, 要保证两个条件: 1. 解一直在候选区间里2. 每次判断后可行区间都会缩小(特别是左右端点相距为1的时候) 所以写二分的时候,一定要测试只有两个点时,不同情况下区间是 阅读全文
posted @ 2018-05-12 12:57 約束の空 阅读(222) 评论(0) 推荐(0)
摘要:直接做 one-pass,一边找最低的价格,一边找最大的gap,就是我们最大的profit。 Kadane's Algorithm 同样是 Kadane's Algorithm,另一种理解思路: 和53题最大子串和一样的题目,把买入到售出当做一个子序列想就一模一样了。DP方程如下: f[i]:以a[ 阅读全文
posted @ 2018-05-02 15:34 約束の空 阅读(120) 评论(0) 推荐(0)
摘要:方法一: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] 阅读全文
posted @ 2018-05-02 12:30 約束の空 阅读(136) 评论(0) 推荐(0)
摘要:典型dfs题,按照框架写。由于之前刚做了200和694,dfs写的很顺手。不同于前两道,dfs需要返回布尔值,因此代码上有些许差异,但总体结构是一样的。 递归终止条件都写在了最前面。 阅读全文
posted @ 2018-05-01 22:39 約束の空 阅读(119) 评论(0) 推荐(0)

上一页 1 ··· 5 6 7 8 9 10 下一页