Merge pull request #2025 from juguagua/master

添加复杂度分析:贪心部分
This commit is contained in:
程序员Carl
2023-04-11 10:05:19 +08:00
committed by GitHub
9 changed files with 43 additions and 5 deletions

View File

@ -88,6 +88,10 @@ public:
};
```
* 时间复杂度: O(n)
* 空间复杂度: O(1)
## 方法二
依然是贪心,思路和方法一差不多,代码可以简洁一些。
@ -127,6 +131,11 @@ public:
};
```
* 时间复杂度: O(n)
* 空间复杂度: O(1)
可以看出版本二的代码相对于版本一简化了不少!
**其精髓在于控制移动下标 i 只移动到 nums.size() - 2 的位置**,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了。

View File

@ -24,8 +24,6 @@
暴力解法的思路,第一层 for 就是设置起始位置,第二层 for 循环遍历数组寻找最大值
- 时间复杂度O(n^2)
- 空间复杂度O(1)
```CPP
class Solution {
@ -44,6 +42,9 @@ public:
}
};
```
* 时间复杂度O(n^2)
* 空间复杂度O(1)
以上暴力的解法 C++勉强可以过,其他语言就不确定了。
@ -98,7 +99,6 @@ public:
}
};
```
- 时间复杂度O(n)
- 空间复杂度O(1)

View File

@ -75,6 +75,10 @@ public:
};
```
* 时间复杂度: O(n)
* 空间复杂度: O(1)
## 总结
这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。

View File

@ -73,6 +73,10 @@ public:
};
```
* 时间复杂度: O(nlogn)
* 空间复杂度: O(logn),排序需要的空间开销
## 其他语言版本

View File

@ -121,6 +121,11 @@ public:
};
```
* 时间复杂度: O(n)
* 空间复杂度: O(n)
## 总结
这在leetcode上是一道困难的题目其难点就在于贪心的策略如果在考虑局部的时候想两边兼顾就会顾此失彼。

View File

@ -56,8 +56,6 @@ C++代码整体如下:
```CPP
// 版本一
// 时间复杂度O(nlogn)
// 空间复杂度O(1)
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
@ -75,6 +73,9 @@ public:
}
};
```
* 时间复杂度O(nlogn)
* 空间复杂度O(1)
从代码中可以看出我用了一个 index 来控制饼干数组的遍历,遍历饼干并没有再起一个 for 循环,而是采用自减的方式,这也是常用的技巧。
@ -118,6 +119,9 @@ public:
}
};
```
* 时间复杂度O(nlogn)
* 空间复杂度O(1)
细心的录友可以发现,这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。

View File

@ -115,6 +115,9 @@ public:
}
};
```
* 时间复杂度: O(n)
* 空间复杂度: O(1)
## 总结

View File

@ -303,6 +303,11 @@ public:
```
* 时间复杂度: O(n),需要遍历二叉树上的每个节点
* 空间复杂度: O(n)
大家可能会惊讶,居然可以这么简短,**其实就是在版本一的基础上使用else把一些情况直接覆盖掉了**。
在网上关于这道题解可以搜到很多这种神级别的代码,但都没讲不清楚,如果直接看代码的话,指定越看越晕,**所以建议大家对着版本一的代码一步一步来,版本二中看不中用!**。

View File

@ -85,6 +85,10 @@ public:
};
```
* 时间复杂度: O(nlogn)
* 空间复杂度: O(1)
## 总结
贪心的题目如果简单起来,会让人简单到开始怀疑:本来不就应该这么做么?这也算是算法?我认为这不是贪心?