c++ - 如何在复杂度 O(n) 中解决单调数组问题?
问题描述
一个数组是单调的,如果它是递增的或单调递减的。
例子:
输入:[1,2,2,3] 输出:真
输入:[3,2,2,1] 输出:真
输入:[1,3,2] 输出:假
这是我的 O(nlogn) 时间复杂度的代码。我使用排序和一个额外的数组来解决这个问题。我的代码如下:
bool isMonotonic(vector<int> array) {
vector<int>extraArray;
int i,j;
for(i=0;i<array.size();i++){
extraArray.push_back(array[i]);
}
sort(extraArray.begin(),extraArray.end());
for(i=0;i<array.size();i++){
if(array[i] != extraArray[i])
break;
}
if(i == array.size())
return true;
for(i = array.size() -1,j=0;j<extraArray.size();i--,j++){
if(array[i] != extraArray[j])
break;
}
if(j == extraArray.size())
return true;
return false;
}
如何以 O(n) 时间复杂度解决它?
解决方案
您使用的策略通过将数组排序为子步骤来工作。使用标准排序算法需要时间 O(n log n),这是代码中的瓶颈。问题是——你真的需要对数组进行排序来做到这一点吗?
作为提示,请查看前两个元素。如果第二个元素大于第一个元素,那么数组单调的唯一方法是整个数组单调递增。你能检查一下是不是这样吗?如果第二个元素小于第一个元素,则数组单调的唯一方法是整个数组单调递减。你能检查一下吗?如果前两个元素相等,你应该怎么做?
推荐阅读
- angular - 如何使用角度材料中的自动完成选项绑定输入字段(从 DB 到 UI / UI 到 DB)?
- r - 如何计算向量中符号的变化(正或负)
- python-3.x - 如果列表中没有数字,我该如何退出程序(python)
- excel - 使用类模块在类型内输入
- opencv - 如何使用opencv使白色像素更亮?
- android - 重新加载 Fragment 时,范围为 Fragment 的 ViewModel 不会被破坏
- python - In python is there a way to delete parts of a column?
- kubernetes - 普罗米修斯中覆盖标签的问题
- c++ - 在类构造函数初始化器列表中初始化 std::array :如果默认构造函数不可用,则用固定类填充值
- regex - 正则表达式:匹配前面没有任何空格的文本