135. 分发糖果
两次遍历,先从左往右再从右往左。
从左往右遍历时候保证了只要是当前得分大于他左边的得分,他的值就会比他左边的大。从右往左,当遇见当前得分大于右边得分时候,对当前的值判断,如果本身就符合,那就无所谓,如果不符合,就是max(右边+1,本身),所以不会破坏左边遍历的结果。
1 | class Solution { |
O(1)空间复杂度
看题解
递减序列中就层层叠高。
1 | class Solution { |
两次遍历,先从左往右再从右往左。
从左往右遍历时候保证了只要是当前得分大于他左边的得分,他的值就会比他左边的大。从右往左,当遇见当前得分大于右边得分时候,对当前的值判断,如果本身就符合,那就无所谓,如果不符合,就是max(右边+1,本身),所以不会破坏左边遍历的结果。
1 | class Solution { |
O(1)空间复杂度
看题解
递减序列中就层层叠高。
1 | class Solution { |
排序后贪婪
1 | class Solution { |
看题解
根据传递性,如果我能除以一个整除子集中的最大,那么其他所有的我都可以整除。
f[i]表示以下标i结尾的中的最长,g记录着每步的转移,g[i]=j,即这个序列走到i时候是有以j为结尾的整除子集转移而来的
1 | class Solution { |
看题解
1 | class Solution { |
模拟
1 | class Solution { |
排序后滑动窗口
1 | class Solution { |
O(NlogN)
哈希表,把x和x+1的出现个数加上去,厉害啊
1 | class Solution { |
记忆化搜索
如果替换成vector,vector需要n的空间,不行
1 | class Solution { |
时间复杂度:O(logn) 空间复杂度: O(logn)
原因在于这里每一步都会将原数/2
上述重点语句。对于n为奇数来说,n-1和n+1都必然会带来一个偶数,如果是偶数就不是1而且只能除以2,所以把这个操作合并为一次完成就是(n-1)/2或(n+1)/2。
但是考虑到溢出的问题,由于(n-1)/2就是n/2向下取整,而(n+1)/2就是n/2向上取整,因此他们可以表示为n/2和n/2+1。
dp超内存,空间复杂度是O(N)
位运算来判断是否有重复数字
1 | class Solution { |
O(n^2 + 所有字符串长度)
优化空间,记录有相同字母的字符串的最大长度
1 | class Solution { |
切成前半部分和后半部分,后半部分反转
1 | /** |