在解决了cp问题(下面的实现)之后,我很难进行大型O分析,我觉得很舒服。 这是实现:
// argument arrays (alice and scores)
// captures scores
auto findRank = [&](int score, int lastRankIndex) {
// resumes from last returned index
for(auto i=lastRankIndex-1; i>=0; --i) {
if(scores[i] == score) return i+1;
else if(scores[i] > score) return i+2;
}
return 1;
};
vector<int> ranks;
ranks.reserve(alice.size());
int lastRankIndex = scores.size();
// loop over alice
for(const auto& a : alice) {
ranks.push_back(findRank(a, lastRankIndex));
lastRankIndex = ranks.back() - 1;
}
findRank
lambda将会(在lastRankIndex
的帮助下)始终在先前返回的索引处恢复。这意味着两个数组alice
和scores
在我们的情况下可以具有不同的大小,将仅循环一次。
在这种情况下,特别是当内部循环数组大于外部循环数组时,大O应该是什么?