week16
151 - 翻转字符串里的单词
分为两步,举个例子来说: s = "the sky is blue"
将字符串整体翻转
s = "eulb si yks eht"以单词为单位翻转
s = "blue is sky the"
就好了,这里按照空格分割单词可以用到c++的stringstream来处理, 初始化stringstream 之后
while(ss >> word) 就可以按空格将单词分开, 此外额外的空格也会被直接处理
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());
stringstream ss(s), res;
string word;
while(ss >> word)
{
reverse(word.begin(), word.end());
res << word << ' ';
}
string ans = res.str();
ans.pop_back();
return ans;
}
};152 - 乘积最大子数组
回忆一下和最大的子数组的求法, 就是简单的动态规划 f[i] = max(f[i - 1], 0) + nums[i]
表示有两种转移方式,从上一个子数组延续过来,或者另起一段以当前为开头 共两种选择;
这个乘积最大的子数组 和上一题不同的地方在于 有负负得正的情况存在 ,所以除了最大乘积f之外 要额外记录一个 最小乘积g;
最后有三种情况:
自己独立开启一段
nums[i]最大乘积 接着乘
f[i - 1] * nums[i]负负得正 接着乘
g[i - 1] * nums[i]
然后空间可以优化成一维的;
153 - 寻找旋转排序数组中的最小值
实际上这两个题和前面的 33, 34 是一样的,甚至还简化了
154 - 寻找旋转排序数组中的最小值II
同样的, 也是把后面和nums[0]相等的部分提前删去就好了
155 - 最小栈
在维护正常的栈的基础上,额外维护一个前缀最小值栈f, 来记录stack 前i个元素中的最小值就好了
[付费题就先跳过]
160 - 相交链表
这题的思路还挺巧妙的, 记一下

Last updated