1.最长平台

  问题:已知一个从小到大的有序数组,这个数组中一个平台就是连续的一串

值相同的数,并且不可再延伸。请找出最长的平台。例如:1,2,2,3,3,3,3,4,5,5,6中

1,2,3,4,5,6各自是一个平台,找出连续最长的。

  先上python,本人思考问题后总是先用python实现,然后再转成c或者c++,

难道python实现起来容易?我感觉有点。

plateau.py :

 1 def num(a):
 2     t=a[0]
 3     c=0
 4     b=0
 5     tmp=0
 6     for i in a:
 7         if t==i:
 8             c+=1
 9         else:           
10             if b<c:
11                 tmp=t
12                 b=c
13             t=i
14             c=1
15     if b<c:
16             tmp=a[len(a)-1]
17             #b=c
18     return tmp
19 if __name__=='__main__':
20     a=[1,1,1,1,1,1,1,1,1,2,2,3,3,3,\
21        3,4,5,5,5,6,6,6,6,6,6,7,7,8,8,8,8,8,8,8,8,8,8]
22     print num(a)

c语言实现,plateau.c:

 1 #include <stdio.h>
 2 int num(int *a,int len)
 3 {
 4     int t=a[0];
 5     int c=0,b=0,tmp=0;
 6     for (int i =0;i<len;i++)
 7     {
 8         if(t==a[i])
 9             c++;
10         else{
11             if(b<c){
12                 tmp=t;
13                 b=c;
14             }
15             t=a[i];
16             c=1;
17 
18         }
19     }
20     if(b<c)
21         tmp=a[len-1];
22     return tmp;
23 }
24 int main()
25 {
26     int arr[]={1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,4,5,5,5,6,6,6,6,6,6,7,7,8,8,8,8,8,8,8,8,8,8};
27     int tmp=num(arr,37);
28     printf("%d\n", tmp);
29     return 0;
30 }

程序跑起来后,感兴趣看看python程序与c的时间比较:

 1 $ time python plateau.py
 2 8
 3 
 4 real    0m0.144s
 5 user    0m0.015s
 6 sys     0m0.109s
 7 
 8 
 9 $ time ./plateau    //gcc -o plateau plateau.c
10 8
11 
12 real    0m0.046s
13 user    0m0.000s
14 sys     0m0.030s

  主要看红色两行与绿色两行分别相加的结果来比较,C程序可不是一般的快。

至于real时间主要是操作系统中存在中断,导致同一个程序运行时间差异可能也很大,

所以用real比较不太准确,上面的时间计算相对精确些。最近看算法,记录记录,要的要的。

  但是上面的程序效率不高,但是优点是能够很容易的知道哪个数连续最长。下面介绍一个

非常高效的计算出最长数连续多长,但是是哪个数最长,不好解决。主要思想是如果一个数n连续的

长度L,那么下一个比n长就自加L,否则L不变,继续下一个数。

simple.c :

 1 #include <stdio.h>
 2 int num(int *a,int length)
 3 {
 4     int len=1;
 5     int i;
 6     for(i=1;i<length;i++)
 7         if(a[i]==a[i-len])
 8             len++;
 9     return len;
10 }
11 int main()
12 {
13     int arr[]={1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,4,5,5,5,6,6,6,6,6,6,7,7,8,8,8,8,8,8,8,8,8,8};
14     int tmp=num(arr,37);
15     printf("%d\n", tmp);
16     return 0;
17 }

 

转载于:https://www.cnblogs.com/wuchaofan/archive/2013/06/08/3127682.html

最长平台问题通常指的是在一个序列中寻找最长的连续子序列,其中所有元素都相同。这个问题在编程和算法设计中是一个经典问题,可以通过多种方法解决。 一种最直接的方法是遍历组并跟踪当前平台的长度,同时记录最长平台的信息。这种方法的时间复杂度为 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值