Category: ACM题解

袋鼠过河题解(动态规化+贪心算法)

一只袋鼠要从河这边跳到河对岸, 河很宽, 但是河中间打了很多桩子, 每隔一米就有一个, 每个桩子上都有一个弹簧, 袋鼠跳到弹簧上就可以跳的更远. 每个弹簧力量不同, 用一个数字代表它的力量, 如果弹簧力量为5, 就代表袋鼠下一跳最多能够跳5米, 如果为0, 就会陷进去无法继续跳跃. 河流一共N米宽, 袋鼠初始位置就在第一个弹簧上面, 要跳到最后一个弹簧之后就算过河了, 给定每个弹簧的力量, 求袋鼠最少需要多少跳能够到达对岸. 如果无法到达输出-1 输入描述: 输入分两行, 第一行是数组长度N (1 ≤ N ≤ 10000), 第二行是每一项的值, 用空格分隔. 输出描述: …

周末刷刷题找回ACM-er 的感觉

周末一狠心买了 leetcode 一年年费 159美元, 好处是可以解锁更多的编程习题. 于是一周末刷了30多题, 容易和中等的题大约各一半吧. 争分夺秒的刷题, 比如带孩子上 soft play 也可以刷. 我用的是 iphone 8, 大概是2年前买的, 256 GB 用到现在还很好用, 买一个有带支架的外壳, 然后搞一个 made in China 的蓝牙键盘(2个7号电池的 比充电方便一些) 刷过后得到 绿色的 Accepted …

C++ 编程练习题: 如何合并两个二叉树?

题意: 合并两个二叉树, 没有说不可以改变原来的二叉树. 合并的时候把结点求合. C/C++ 中二叉树的定义 在C或者C++中, 二叉树的定义可以很方便的用结构体来表征. 其中左右子树都是递归定义. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) …

C++编程练习题: 找出数组中所有重复的元素

题意, 有一个N大小的数组, 数组里的数字在1到N之间, 有些数字出现2次, 有些数字出现1次. 请找出所有出现2次的数字. 要求时间复杂度是O(N) 空间复杂度是 O(1). 如果不考虑空间复杂度, 那么我们可以开一个O(n) 的哈希表来记录数字是否已经出现过了, 在C++里我们可以用 unordered_set 集合来实现 O(1) 的查找和插入. class Solution { public: vector<int> findDuplicates(vector<int>& nums) { vector<int> r; unordered_set<int> hash; …

C++编程练习题: 找出字符串的所有大小小组合

题意: 给定一个字符串, 输出所有字符大小写都可以组成的字符串. 如: “ab1” 能成生 DFS 深度优先 – 递归 我们可以从字符串的开头递归的把当前字符给添加到最终的字符串中, 当当前字符是字母的时候, 就有两种可能了. 当到达字符串尾部的时候我们把当前字符串添加到结果数组中即可. class Solution { public: vector<string> letterCasePermutation(string S) { search("", S, 0, S.length() - 1); return …