Каталог статей
1. Название
https://tianchi.aliyun.com/oj/118289365933779217/122647324212270018
Описание:
Дайте вам последовательность длины n, в его последовательности, чтобы вы нашли в последовательности долины , долина последовательности определяется как:
- Длина последовательности четная.
- Предположим, что длина подпоследовательности равна 2n. Тогда первые n чисел строго убывают , а последние n чисел строго возрастают , а последний элемент первого абзаца совпадает с первым элементом второго абзаца, который также является минимальным значением в этой последовательности.
Теперь я хочу, чтобы вы нашли самую длинную длину, которая удовлетворяет правилу последовательности долин среди всех подпоследовательностей ?
示例
样例 1:
输入: num = [5,4,3,2,1,2,3,4,5]
输出: 8
样例解释:
最长山谷序列为[5,4,3,2,2,3,4,5]
样例 2:
输入: num = [1,2,3,4,5]
输出: 0
样例解释:
不存在山谷序列
2. Решение проблем
class Solution {
public:
/**
* @param num: sequence
* @return: The longest valley sequence
*/
int valley(vector<int> &num) {
// write your code here
int n = num.size();
if(n <= 1) return 0;
vector<int> up(n, 1), down(n, 1);//最长递增/递减数组
for(int i = 1, j; i < n; i++) //正序
{
for(j = 0; j < i; j++)
{
if(num[j] > num[i])//前面的比当前大,递减
down[i] = max(down[i], down[j] + 1);
}
}
for(int i = n-2, j; i >= 0; i--) //逆序遍历
{
for(j = i+1; j < n; j++)
{
if(num[j] > num[i])//后面的比当前大,递增
up[i] = max(up[i], up[j] + 1);
}
}
int maxlen = 0;
for(int i = 0, j; i < n; i++)
{
for(j = i+1; j < n; j++)
{
if(num[i] == num[j])//最小的数
{
maxlen = max(maxlen, min(down[i],up[j])*2);
} // 两侧等长的递减 递增
}
}
return maxlen;
}
};
Сложность времени O (n 2) O (n ^ 2)О ( п2 )
Адрес моего блога CSDN https://michael.blog.csdn.net/
Нажмите и удерживайте или отсканируйте QR-код, чтобы подписаться на мою официальную учетную запись (Майкл Амин), приходите вместе, учитесь и добивайтесь прогресса вместе!