Easy题目总结

正常技巧题

implement queue using stack: https://leetcode.com/problems/implement-queue-using-stacks/

用两个stack,push时存入stack1,如果stack2为空则将stack1所有的元素存入stack2,否则直接从stack2进行pop(不必再存回stack1)


binary tree level order traversal: https://leetcode.com/problems/binary-tree-level-order-traversal/

用一个queue存储树的节点。当queue不为空时记录下当前queue的size,用一个for循环依次pop出queue中的元素,将相应的值push_back进一个临时的vector名为tmp_result,如果有必要的话将新的节点入队。for循环结束后将tmp_result加入result,并将tmp_result进行clear

这道题还有一个解法是用preorder遍历,使用一个单独的递归函数,将depth作为输入的参数,每到新的一层向result中push_back一个新的vector,如果不是新的一层就将数据push_back到对应result编号的vector中去

(DFS,详细参考 https://leetcode.com/discuss/15521/one-of-c-solutions-preorder)


palindrome linked list: https://leetcode.com/problems/palindrome-linked-list/

找到链表的中间,然后将后半链表reverse,然后与前半链表进行比对并同时恢复链表


first bad version: https://leetcode.com/problems/first-bad-version/

只要对mid调用isBadVersion()。需要注意的是求mid时要用head + (tail - head) / 2而不是(head + tail) / 2,否则可能会溢出。另外mid如果是false的话记得head = mid + 1以避免死循环出现


min stack: https://leetcode.com/problems/min-stack/

创建另一个stack存放最小值。在push时,如果当前值<=getMin(),则将其push入存放最小值的stack。注意要使用"<="因为最小值可能出现多次


rotate array: https://leetcode.com/problems/rotate-array/

1)创建一个同样大小的vector,时间O(n),空间O(n)

2)将原vector的前n - k个元素添加到一个新vector中,erase原vector的前n - k个元素,然后将新数组insert到原数组的后面,时间O(n),空间O(n)

3)方法同2),不过逐个地将erase的元素push_back到原vector的最后,时间O(n),空间O(1)

4)先reverse前n - k个元素,再reverse后k个元素,最后reverse所有元素,时间O(n),空间O(1)

5)改变当前位置对应的所在新位置的元素,然后将当前位置设为新的位置,依次类推逐个地改变所有元素。需要注意的是如果k是n的约数则会出现重复,当出现重复时,将当前位置向后移动一个,时间O(n),空间O(1)

6)将前k个元素与后k个元素交换,这样数组的前k个位置就是正确的了,然后再对后n - k个元素进行同样的操作直到k变为0,注意每次要处理的数组长度变小,相应的k也要重新对新的长度取余,时间O(n),空间O(1)


string to integer: https://leetcode.com/problems/string-to-integer-atoi/

判断overflow最好的方法:(value > INT_MAX / 10) || (value == INT_MAX / 10 && str[i] - '0' > INT_MAX % 10)


Paint Fence: https://leetcode.com/problems/paint-fence/

设两个数组diff和same,分别表示第 i 个位置最后两个post颜色相同和颜色不同的组合数,则diff[i] = (k - 1) * diff[i - 1] + (k - 1) * same[i - 1],same[i] = diff[i - 1],最后返回diff[n - 1] + same[n - 1]即可。可以用四个变量将空间复杂度优化为O(1)


Maximum Size Subarray Sum Equals k: https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/

使用一个名为sum的unordered_map,以从头累加到当前位置的和为key,存储当前的位置。如果当前位置 i 的累加和cur_sum == k,则max_len = i + 1,否则寻找cur_sum - k是否在sum中,如果存在,则max_len = max(max_len, i - sum[cur_sum - k])。每次检查cur_sum在不在sum中,如果不在则插入。这里只要在cur_sum第一次出现时插入sum因为这样能保证subarray是最长的





算法题

happy number: https://leetcode.com/problems/happy-number/

如果结果存在非1的循环,则不是happy number,所以可以通过检查结果是否存在循环来判断。一个可用的cycle detection算法是Floyd algorithm(也叫Tortoise and hare algorithm)。思想是设置两个指针p1,p2。p1一次移动一个单位,p2一次移动两个单位,当p1 == p2时表示循环出现。如果此时的值是1,则返回true,否则返回false。算法详情参考https://en.wikipedia.org/wiki/Cycle_detection,实现详情参考https://leetcode.com/discuss/33055/my-solution-in-c-o-1-space-and-no-magic-math-property-involved

这道题还有一个解法就是用hash table,不断计算下一个值,检查这个值在hash table中是否存在,如果不存在则插入;如果存在检查结果是不是1,如果是1则返回true,否则返回false



数学技巧题

Nim Game: https://leetcode.com/problems/nim-game/

n是4的倍数时一定失败


add digits: https://leetcode.com/problems/add-digits/

return 1 + (num - 1) % 9;


Factorial Trailing Zeros: https://leetcode.com/problems/factorial-trailing-zeroes/

返回5^1的个数 + 5^2的个数 + ... + 5^i的个数,其中5^(i+1) > n。从n开始依次÷5倒着往下比较快,并且保证数据不会溢出



奇技淫巧题

move zeros: https://leetcode.com/problems/move-zeroes/

找到第一个0,记录0的个数为count,将 a[i+count] 移动到 a[i]。可以理解为设定了两个指针


Roman to integer: https://leetcode.com/problems/roman-to-integer/

判断prev和current的关系


ugly number: https://leetcode.com/submissions/detail/43018831/

约去num中所有的2、3、5因数,如果结果为1则返回true,否则返回false。实际约去所有的2、3、5之后如果num不为1,则说明有除2、3、5之外的质因数


intersection of two linked list: https://leetcode.com/submissions/detail/45376303/

设两个指针分别指向两个list,当指针移动到list的结尾后再指向另一个list,两个指针最终会指向第一个intersection的node


rectangle area: https://leetcode.com/problems/rectangle-area/

超级傻逼。


isomorphic strings: https://leetcode.com/problems/isomorphic-strings/

定义两个256长度的数组并初始化为0,同时遍历两个字符串,每次先检查当前字符上一次出现的位置是否相同,若不同返回false,若相同则更新该字符的出现位置


range sum query: https://leetcode.com/submissions/detail/47164891/

将前n个数的和存在private的vector中。注意要在vector的最前面加一个0



你可能感兴趣的:(Easy题目总结)