最长平台


💐The Begin💐点点关注,收藏不迷路💐

已知一个已经从小到大排序的数组,这个数组的一个平台(Plateau)就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在 1,2,2,3,3,3,4,5,5,6中1,2-2,3-3-3,4,5-5,6都是平台。试编写一个程序,接收一个数组,把这个数组最长的平台找出 来。在上面的例子中3-3-3就是最长的平台。

输入

第一行有一个整数n(n <= 1000),为数组元素的个数。第二行有n个整数,整数之间以一个空格分开。

输出

输出最长平台的长度。

样例输入

10
1 2 2 3 3 3 4 5 5 6

样例输出

3

先获取输入数组的元素个数以及数组元素内容,然后通过遍历数组,比较相邻元素是否相等来判断是否处于同一个平台,若是则当前平台长度加1,并在当前平台长度大于已记录的最长平台长度时更新最长平台长度,若相邻元素不相等则重置当前平台长度为1,最后输出最长平台的长度。

C语言代码

#include <stdio.h>

int main() {
int n;
scanf(“%d”, &n); // 读取输入的数组元素个数n

int arr[n];  // 定义数组来存储输入的数组元素
for (int i = 0; i < n; i++) {
    scanf("%d", &arr[i]);  // 循环读取n个整数,存入数组
}

int max_length = 1;  // 用于记录最长平台的长度,初始化为1,因为至少有一个元素也算一个平台
int current_length = 1;  // 当前平台的长度,初始化为1
for (int i = 1; i < n; i++) {  // 从数组的第二个元素开始遍历
    if (arr[i] == arr[i - 1]) {  // 如果当前元素和前一个元素相等,说明在同一个平台上
        current_length++;  // 当前平台长度加1
        if (current_length > max_length) {  // 如果当前平台长度大于已记录的最长平台长度
            max_length = current_length;  // 更新最长平台长度
        }
    } else {  // 如果当前元素和前一个元素不相等,说明进入了新的平台
        current_length = 1;  // 重置当前平台长度为1
    }
}

printf("%d\n", max_length);  // 输出最长平台的长度

return 0;

}

C++ 语言代码

#include <iostream>
using namespace std;

int main() {
int n;
cin >> n; // 输入数组元素的个数n

int arr[n];  // 创建数组用于存放输入的数组元素
for (int i = 0; i < n; i++) {
    cin >> arr[i];  // 依次输入n个整数到数组中
}

int max_length = 1;  // 初始化最长平台长度为1,最少有一个元素也算平台
int current_length = 1;  // 当前平台的长度,初始化为1
for (int i = 1; i < n; i++) {  // 从数组第二个元素开始遍历
    if (arr[i] == arr[i - 1]) {  // 若当前元素与前一个元素相等,处于同一平台
        current_length++;  // 当前平台长度加1
        if (current_length > max_length) {  // 若当前平台长度大于已记录的最长平台长度
            max_length = current_length;  // 更新最长平台长度
        }
    } else {  // 若当前元素与前一个元素不相等,进入新平台
        current_length = 1;  // 重置当前平台长度为1
    }
}

cout << max_length << endl;  // 输出最长平台的长度

return 0;

}

Java语言代码

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 获取输入的数组元素个数n

    int[] arr = new int[n];  // 定义数组来存储输入的数组元素
    for (int i = 0; i < n; i++) {
        arr[i] = scanner.nextInt();  // 循环读取n个整数并存入数组
    }

    int max_length = 1;  // 初始最长平台长度为1,因为一个元素也算一个平台
    int current_length = 1;  // 当前平台长度,初始化为1
    for (int i = 1; i < n; i++) {  // 从数组第二个元素开始遍历
        if (arr[i] == arr[i - 1]) {  // 如果当前元素和前一个元素相等,在同一平台上
            current_length++;  // 当前平台长度加1
            if (current_length > max_length) {  // 若当前平台长度大于已记录的最长平台长度
                max_length = current_length;  // 更新最长平台长度
            }
        } else {  // 如果当前元素和前一个元素不相等,进入新平台
            current_length = 1;  // 重置当前平台长度为1
        }
    }

    System.out.println(max_length);  // 输出最长平台的长度
}

}

Python语言代码

n = int(input())  // 获取输入的数组元素个数n
nums = list(map(int, input().split()))  // 获取输入的数组元素,转换为列表

max_length = 1  # 初始化最长平台长度为1,至少一个元素也算平台
current_length = 1  # 当前平台长度,初始化为1
for i in range(1, len(nums)):  # 从列表第二个元素开始遍历
    if nums[i] == nums[i - 1]:  # 如果当前元素和前一个元素相等,在同一平台上
        current_length += 1  # 当前平台长度加1
        if current_length > max_length:  // 若当前平台长度大于已记录的最长平台长度
            max_length = current_length  # 更新最长平台长度
    else:  # 如果当前元素和前一个元素不相等,进入新平台
        current_length = 1  # 重置当前平台长度为1

print(max_length)  // 输出最长平台的长度

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐
最长平台问题通常指的是在一个序列中寻找最长的连续子序列,其中所有元素都相同。这个问题在编程算法设计中是一个经典问题,可以通过多种方法解决。 一种最直接的方法是遍历数组并跟踪当前平台的长度,同时记录最长平台的信息。这种方法的时间复杂度为 O(n),空间复杂度为 O(1),因为只需要额外的空间来存储一些变量。 下面是一个 Python 实现的例子: ```python def find_longest_platform(arr): if not arr: return [], 0 max_length = 1 max_start = 0 current_length = 1 current_start = 0 for i in range(1, len(arr)): if arr[i] == arr[i - 1]: current_length += 1 else: if current_length > max_length: max_length = current_length max_start = current_start current_length = 1 current_start = i # 检查最后一个平台是否是最长的 if current_length > max_length: max_length = current_length max_start = current_start return arr[max_start:max_start + max_length], max_length # 示例数组 example_array = [1, 2, 2, 2, 3, 4, 4, 4, 4, 5] longest_platform, length = find_longest_platform(example_array) print(f"最长平台: {longest_platform}, 长度: {length}") ``` 此代码首先检查输入数组是否为空。如果为空,则返回空列表和零长度。否则,它初始化几个变量来跟踪最长平台的长度和起始位置,以及当前平台的长度和起始位置。通过遍历数组,当发现当前元素与前一个元素相同时,增加当前平台的长度;不同时则检查当前平台是否比已知的最长平台长,并更新相应的变量。最后,检查循环结束后可能存在的最长平台。 另一种方法可以使用滑动窗口技术,这在处理这类问题时非常有效。滑动窗口可以在单次遍历中找到最长的连续子序列,这种方法同样具有 O(n) 的时间复杂度和 O(1) 的空间复杂度。 ```python def find_longest_platform_sliding_window(arr): if not arr: return [], 0 start = 0 max_start = 0 max_length = 1 for end in range(1, len(arr)): if arr[end] == arr[end - 1]: if end - start + 1 > max_length: max_length = end - start + 1 max_start = start else: start = end return arr[max_start:max_start + max_length], max_length # 使用滑动窗口技术的示例 example_array_sw = [1, 2, 2, 2, 3, 4, 4, 4, 4, 5] longest_platform_sw, length_sw = find_longest_platform_sliding_window(example_array_sw) print(f"最长平台(滑动窗口): {longest_platform_sw}, 长度: {length_sw}") ``` 在这段代码中,滑动窗口通过移动窗口的结束指针来扩展窗口,当遇到不同的元素时,重置窗口的开始指针。这种方法同样能够有效地找到最长的连续相同元素子序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seal^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值