解题记录
jack_ricky
这个作者很懒,什么都没留下…
展开
-
LeetCode 217. Contains Duplicate
题意:给一个数组,如果数组内有重复元素就返回true,反之返回false。solution:hash key为数组元素,value是countclass Solution {public: bool containsDuplicate(vector<int>& nums) { unordered_map<int, int>hash; ...原创 2018-02-09 12:48:11 · 106 阅读 · 0 评论 -
LeetCode 645. Set Mismatch
题意:一个size为n的数组,包含数字1-n,但是有一个元素重复了,占用了其他元素的位置。找出这个重复的元素和被占用的元素。solution:遍历两次数组,第一次记录元素的出现情况,第二次查找特殊元素。class Solution {public: vector<int> findErrorNums(vector<int>& nums) { ...原创 2018-02-28 10:40:05 · 269 阅读 · 0 评论 -
LeetCode 242. Valid Anagram
题意:给一个字符串s,判断字符串t是否由s的字母重构而成。solution 1. hash。记录char-count。solution 2. sorting。对比排序之后的字符串是否相等。实现最为简单,但是排序算法的复杂度比较高,不如hash线性复杂度。看来代码简单并不等价于“效率高”solution 3. 数组模拟hash。因为只包含小写字母所以可以利用数组[26]来模拟hash表。用简单的of...原创 2018-02-17 21:44:14 · 116 阅读 · 0 评论 -
LeetCode 387. First Unique Character in a String
题意:找出给定字符串中出现的第一个 仅出现一次的 元素,不存在仅出现一次的元素返回-1。solution 1:数组模拟hash。这是昨天学到的,秀一波。其实要写在一个循环里应该也是可以的,因为直观的想:只需要遍历一遍数组就可以知道答案。但是这种方法也足够好了。class Solution {public: int firstUniqChar(string s) { int...原创 2018-02-18 14:22:53 · 113 阅读 · 0 评论 -
LeetCode 599. Minimum Index Sum of Two Lists
题意:找出两个人都喜欢的餐厅,返回序号之和最小的。solution:hash记录餐馆名对应的序号之和。遍历第一个数组时,记录每一个餐厅的序号,遍历第二个数组时,仅处理在1中出现过的餐厅。class Solution {public: vector<string> findRestaurant(vector<string>& list1, vector<...原创 2018-02-19 14:13:04 · 173 阅读 · 0 评论 -
LeetCode 463. Island Perimeter
题意:二维数组,1表示岛屿,岛屿都是边相连的,有且仅有一个岛。问岛的周长是多少?solution 1:hash。每访问一个点,就将四周的点的sibling数+1。hash记录坐标-sibling数。原因在于一个点有4条边,每多一个sibling,有效边就少一条。这种方法需要访问所有为1的点,并将其四周的sibling进行操作。note:如果使用unordered_map会报错,原因是unorder...原创 2018-02-21 12:17:19 · 189 阅读 · 0 评论 -
205. Isomorphic Strings
题意:给两个长度相同的字符串,如果其中一个可以通过字母的替换获得另一个字符串(且不同的字母不能替换成相同的字母),则返回true。solution:hash表记录,s->t中字母的映射关系,同时记录t中哪些字母已经被替换过了。class Solution {public: bool isIsomorphic(string s, string t) { unorder...原创 2018-03-01 10:39:51 · 119 阅读 · 0 评论 -
LeetCode 575. Distribute Candies
题意:给一个偶数长数组,每种数字代表一种糖果,两人平分。问一人最多获得几种糖果?solution 1:hash。见注释solution 2:bitset。用bitset模拟hash。省去了相对复杂的hash运算,位运算的效率极高。note:其实思路都是一致的,只是实现的方式不同。在应用中自然是约高效越好,但是在都能满足需求的前提下,我认为使用自己熟悉的方法更合适、更稳妥。class Solutio...原创 2018-02-22 15:48:19 · 135 阅读 · 0 评论 -
LeetCode 500. Keyboard Row
题意:给一个字符串数组,判断哪些字符串可以仅用键盘中的同一行字母拼出。solution1:hash。记录每个字母的行号。solution2:数组模拟hash。总结:1. 这道题虽然很简单,但是第一次写的时候花了特别多的时间,因为bool same这个变量的声明位置放在了循环外,导致每一次same的初值实际上就是上一次处理的结果。找这个小错误花了很多时间。2. 做了差不多半个月的hash专项,发现自...原创 2018-02-24 12:09:50 · 121 阅读 · 0 评论 -
LeetCode 771. Jewels and Stones
题意:给出一个没有重复字母的字符串 J 表示宝石的种类,S表示拥有的石头的种类,问拥有的石头中有多少是宝石。solution:hash记录J中宝石的种类,再去查询S中的石头是否在hash表中出现过。class Solution {public: int numJewelsInStones(string J, string S) { unordered_map<cha...原创 2018-02-24 12:38:30 · 219 阅读 · 0 评论 -
LeetCode 136. Single Number
题意:数组中出了一个元素仅出现一次外,所有的元素都出现了两次,找出这个仅出现一次的元素。要求做到线性时间复杂度和空间复杂度。solution1:hash。记录每个元素的count,需要遍历两次数组,因此复杂度是O(2N)。solution2:XOR。这个玩法之前接触过,但是印象不深,看来找不同时也可以考虑XOR。这种方法只需要访问一次,而且位操作的效率很高,时间复杂度是O(N)。class Sol...原创 2018-02-15 11:43:09 · 135 阅读 · 0 评论 -
LeetCode 690. Employee Importance
题意:给一个员工的数据结构,保存了1.id 2.重要值 3.直接管辖的员工id。要求给出一个id,返回他和他的所有直接/间接下属的重要值之和。solution:hash。用排序+暴力+递归的方法应该也是很好做的,但是效率肯定会受影响。使用hash只需要至多遍历一遍数组即可。/*// Employee infoclass Employee {public: // It's the un...原创 2018-02-14 17:09:53 · 229 阅读 · 0 评论 -
LeetCode 202. Happy Number
题意:快乐数是各位平方和最终可以等于1的数,判断一个数是否是快乐数。solution:用hash记录出现过的平方和,如果有重复出现的且不为1,那么不可能是快乐数。、class Solution {public: int dgt_sqr_sum(int x) { int sum = 0; while ( x!=0 ) { int dg...原创 2018-02-27 14:25:27 · 133 阅读 · 0 评论 -
LeetCode 219. Contains Duplicate II
题意:给一个数组,找出是否有两个相同的元素,且其位置差值最多为ksolution:hash key为元素值,value要保存的不仅仅是是否出现过,还要保存位置信息,因此是unordered_map<int, vector<int>> hash。class Solution {public: bool containsNearbyDuplicate(vector&l...原创 2018-02-09 19:15:02 · 93 阅读 · 0 评论 -
LeetCode 554. Brick Wall
题意:给一个二维数组表示一堵墙,问画一条竖线最少需要穿过几块砖?solution:可以理解为在哪个长度上,砖块的“边缘”最多。用hash记录砖块边缘的位置(注意,最右边的砖块不考虑因为其边缘是墙边),返回砖块的行数-最大边缘数量class Solution {public: int leastBricks(vector<vector<int>>& wall...原创 2018-02-10 11:29:42 · 230 阅读 · 0 评论 -
LeetCode 632. Smallest Range
题意:给K个list,找出一个最小范围,要求每个list至少包含一个元素。solution 1. 暴力搜索。s1 将K个数组进行合并,并排序,记录每一个元素原来属于哪一个数组。也就是说每一个元素都是一个pair<int, int> value, ids2 滑动窗口。遍历数组中的每一个元素,以该元素为起点,一步一步寻找窗口的结尾,直到覆盖了所有的数组。 2.1 如何判断是否覆盖了所有的...原创 2018-02-11 15:52:14 · 438 阅读 · 0 评论 -
LeetCode 1. Two sum
题意:给一个数组,和一个目标值target。找出数组中的(有且仅有)两个数,和为target。返回这两个数的index。solution 1: 用贪婪算法在O(n^2)的时间复杂度下可以简单的完成。solution 2: 其实问题的关键在于给一个元素,找出数组中的另一个元素与之匹配。想要快速查找于是乎就想到用hash表。给出一个元素,target-元素 = 需要的元素,那么要用hash表快原创 2018-02-06 21:39:13 · 104 阅读 · 0 评论 -
LeetCode 94. Binary Tree Inorder Traversal
题意:给一个二叉树(树结构),返回中序遍历(左子节点,根节点,右子节点)。solution 1: 递归无需多言,但是需要逐层调用,而且压栈了冗余的信息。效率低。solution 2: 了解中序遍历的原理,手动模拟压栈的过程。如果有左子节点,不断地将左子节点压栈;没有左子节点了,那么此时应该访问其根节点,因此出栈栈顶元素,此时应该访问右子节点,因此将右子节点压栈。循环,直到空栈且当前节点为n原创 2018-02-06 22:06:17 · 132 阅读 · 0 评论 -
LeetCode 447. Number of Boomerangs
题意:给若干个二维点,找出所有的点序列i, j, k使得i到另外两个点的距离相同。返回这样的序列的个数。solution 0: 贪心算法。确定i,确定j,寻找k。一个极其复杂的三重循环。solution 1. 遍历点集,用hash表存储当前节点到所有其他点的距离。此题的关键不在于当前点与哪些点有相同的距离,而在于对于某个特定的距离有几个点,因此指出要存储dist对应的count即可。快速根原创 2018-02-06 22:20:57 · 115 阅读 · 0 评论 -
LeetCode 350. Intersection of Two Arrays II
题意:求两个数组的相交。要求相同的元素不合并,全部输出。solution:hash。首先记录第一个数组的元素出现情况count,然后遍历第二个数组,每次先将相应的hash值-1,如果此时hash值仍大于等于0。这么做是因为交集中元素的最大出现次数也不会大于第一个数组的出现次数。class Solution {public: vector<int> intersect(vect...原创 2018-02-26 19:02:59 · 129 阅读 · 0 评论 -
LeetCode 349. Intersection of Two Arrays
题意:找出两个数组的交集,要求交集没有重复元素,且对元素的顺序没有要求。solution:做了几天的hash表,现在感觉这种题目已经很简单了。用hash记录一下元素是否出现,然后在检查第二个数组时,只需要判断该元素是否有出现即可(注意不能有重复元素,因此要销毁hash表的内容)。note:为什么我不放在一个循环里?其实是可以的,循环的条件变为:nums1没结束 || nums1没结束,循环内还要判...原创 2018-02-12 22:03:20 · 129 阅读 · 0 评论 -
LeetCode 594. Longest Harmonious Subsequence
题意:给一个数组,找出一个最长的子串,要求子串的最大值和最小值为1。Solution: 可以利用hash建立数值与count之间的映射,找到最长大的hash[x]+hash[x+1].class Solution {public: int findLHS(vector& nums) { // 用hash表存储某一数值对应的元素有几个。 // 结果是原创 2018-02-07 16:48:10 · 135 阅读 · 0 评论 -
LeetCode 409. Longest Palindrome
题意:给一个字符串,问用该字符串能构造出的最长的回文串的长度。solution:hash。记录每个字母出现的次数,如果是偶数次那么全部可用,如果是奇数次那么可用n-1,如果有字母出现奇数次,那么最后的结果还需要加一。note:c++奇数/2是下取整。还可以用int a[256]来模拟hash表,用空间换时间。class Solution {public: int longestPalin...原创 2018-02-25 12:09:21 · 92 阅读 · 0 评论