这就是我的想法
- 首先,你需要知道你是从高开始还是从低开始。例如:
1-2-1
或2-1-2
。你甚至可能没有交替对。
- 然后,您随后考虑每个数字,看看它是否属于序列,同时考虑当前方向。
- 每次序列中断时,您都需要通过检查方向重新开始。
我不确定是否有可能在您已经看到的数字中,选择不同的起始数字可能会生成更长的序列。也许有一个定理表明这是不可能的;也许这很明显,我想多了。但我认为这是不可能的,因为一个序列被打破的原因是因为你有两个高点或两个低点,而且没有办法解决这个问题。
我假设以下情况
{}
- 没有元素,返回 0
{1}
- 单个元素,返回 0
{1, 1, 1}
- 没有交替序列,返回 0
对超出 C# 预期的输入没有限制。大概可以浓缩吧。不确定是否有一种方法可以在不明确跟踪方向的情况下捕获方向变化逻辑。
static int max_alternate(int[] numbers)
{
int maxCount = 0;
int count = 0;
int dir = 0; // whether we're going up or down
for (int j = 1; j < numbers.Length; j++)
{
// don't know direction yet
if (dir == 0)
{
if (numbers[j] > numbers[j-1])
{
count += 2; // include first number
dir = 1; // start low, up to high
}
else if (numbers[j] < numbers[j-1])
{
count += 2;
dir = -1; // start high, down to low
}
}
else
{
if (dir == -1 && numbers[j] > numbers[j-1])
{
count += 1;
dir = 1; // up to high
}
else if (dir == 1 && numbers[j] < numbers[j-1])
{
count += 1;
dir = -1; // down to low
}
else
{
// sequence broken
if (count > maxCount)
{
maxCount = count;
}
count = 0;
dir = 0;
}
}
}
// final check after loop is done
if (count > maxCount)
{
maxCount = count;
}
return maxCount;
}
以及一些基于我对问题的理解和一些假设的结果的测试用例。
static void Main(string[] args)
{
int[] nums = { 1}; // base case == 0
int[] nums2 = { 2, 1 }; // even case == 2
int[] nums3 = { 1, 2, 1 }; // odd case == 3
int[] nums4 = { 2, 1, 2 }; // flipped starting == 3
int[] nums5 = { 2, 1, 2, 2, 1, 2, 1 }; // broken seqeuence == 4
int[] nums6 = { 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 1 }; // long sequence == 14
Console.WriteLine(max_alternate(nums));
Console.WriteLine(max_alternate(nums2));
Console.WriteLine(max_alternate(nums3));
Console.WriteLine(max_alternate(nums4));
Console.WriteLine(max_alternate(nums5));
Console.WriteLine(max_alternate(nums6));
Console.ReadLine();
}