经典最长平台算法
已知一个已经从小到大排序的数组,这个数组中的一个平台(Plateau)就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中[1]、[2,2]、[3,3,3]、[4]、[5,5]、[6]都是平台。尝试编写一个程序,接受一个数组,把这个数组中最长的平台找出来。在上面的例子中3,3,3就是该数组中最长的平台。
要求:
1、使用的变量越少越好。
2、把数组的元素每一个都只查一次就得到结果。
3、程序的语句也要越少约好。
我尝试写了这个问题的解法,程序还有待优化(还有新的想法,先给出比较直观的解法)
import java.lang.*;
public class LargestPlateau{
public static void getLargestPlateau(int[] numberSequence){
int cnt=1;
int index=0;
int largestTimes=1;
int times=1;
while(cnt<numberSequence.length){
if(numberSequence[cnt-1]!=numberSequence[cnt]){
if(largestTimes<times){
largestTimes=times;
index=cnt-times;
times=1;
}else{
times=1;
}
}else{
++times;
}
++cnt;
}
for(int i=index;i<index+largestTimes;++i){
System.out.print(numberSequence[i]+" ");
}
System.out.println();
}
public static void main(String[] args){
int[] numberSequence={1,2,2,3,3,3,4,5,5,5,5,5,6};
LargestPlateau.getLargestPlateau(numberSequence);
}
}
如果只是需要计算出一串元素的最长平台的长度,那么还可以有以下的解法(参考David Gries编写的相关专著):
import java.lang.*;
public class LargestPlateau1{
public static int getMaxLengthofLargestPlateau(int[] numberSequence){
int size=numberSequence.length;
int length=1;
for(int i=1;i<size;++i){
if(numberSequence[i]==numberSequence[i-length]){
length++;
}
}
return length; //the length of largest plateau
}
public static void main(String[] args){
int[] numberSequence={1,2,2,3,3,3,4,5,5,5,5,5,6,6};
System.out.println("The length of largest plateau : "+LargestPlateau1.getMaxLengthofLargestPlateau(numberSequence));
}
}
分享到:
相关推荐
"程序员实用算法——sourceCode"这个主题涵盖了各种在实际开发中经常遇到的算法,通过源代码的形式来展示这些算法的实现。下面将详细介绍一些重要的算法类型及其应用。 1. 排序算法:包括快速排序、归并排序、冒泡...
《十五类算法全集——经典算法》是一份深入学习计算机科学和编程的宝贵资源,它涵盖了从基础到高级的各种算法,旨在帮助初学者和有经验的程序员更好地理解和应用这些算法。算法是解决问题和优化计算过程的关键工具,...
这章的代码可能涉及区间调度、霍夫曼编码等经典问题。 5. `ch5`(图论):图论是算法竞赛中非常重要的一部分,包括图的遍历、最小生成树、最短路径算法(如Dijkstra、Floyd-Warshall)、网络流等问题。读者可以通过...
最长公共子序列(Longest Common Subsequence,LCS)是一个经典的计算机科学问题,涉及序列比较和算法设计。在本实验报告中,我们将深入探讨如何利用动态规划方法解决这一问题。 首先,LCS问题旨在找到两个给定序列...
背包问题、最长公共子序列、最短路径等都是动态规划的经典应用。理解动态规划的思想,可以让我们处理复杂问题时更有条理。 《贪心算法》则是另一种策略,通过每一步选择局部最优解来逐步达到全局最优。贪心策略在...
通过学习《数据结构与算法——C++版(第3版)》,读者可以提升对计算机底层运作的理解,提高编程能力,为解决实际问题打下坚实的基础。实践中,读者应结合书中的源代码,动手实现并测试这些数据结构和算法,以加深理解...
如背包问题、最长公共子序列、最短路径等经典问题。 8. **递归与分治策略**:递归是解决问题的一种强大工具,如斐波那契数列、汉诺塔等。分治策略则通过将大问题分解为小问题来解决,如归并排序和快速排序就是分治...
学习《数据结构与算法——C++版》这本书,不仅可以深入理解数据结构和算法的原理,还能掌握如何在C++环境中高效地实现它们,这对于提升编程技能和解决实际问题具有重要意义。通过阅读书中的例子和练习,你可以更好地...
动态规划算法是一种强大的算法设计技术,主要用于解决多阶段决策过程中的最优化问题。它的核心思想是通过将复杂问题分解为相互关联的子问题,并利用子问题的最优解来构建原问题的最优解。动态规划强调的是“空间换...
这篇实验报告主要探讨了在数据与算法领域中如何找到数列的最长递增子序列,这是一个常见的算法问题,尤其在计算机科学的算法设计与分析中占有重要地位。实验的目的是通过设计、实现和分析算法来锻炼解决问题的能力。...
通过深入学习和实践这些超级经典算法,不仅可以提升C语言编程能力,还能培养良好的问题解决思维。在实际项目中,了解何时以及如何运用这些算法至关重要,这将直接影响程序的效率和可维护性。因此,无论是为了学术...
《数据结构算法——Visual C++ 6.0程序集》是一部专为学习和实践数据结构与算法设计的书籍,特别适合使用C++编程语言的读者。本书通过Visual C++ 6.0这一经典开发环境,提供了丰富的实例代码,旨在帮助读者深入理解...
- 替换策略是移除最长时间未被访问的页面。 3. **缺页统计**: - 每当发生一次页面替换,即表示发生了一次缺页。 - 缺页次数通过变量`u`来累计。 4. **输出结果**: - 输出每一时刻内存中的页面状态。 - 输出...
经典动态规划问题包括最长公共子序列、背包问题、最短路径问题(如Dijkstra算法)、矩阵链乘法等。它们在计算机科学和工程领域有广泛的应用,如网络流量优化、资源分配、生物信息学分析等。 总结来说,动态规划是一...
5. **动态规划**:动态规划是一种用于求解最优化问题的方法,适用于解决有重叠子问题和最优子结构性质的问题,如背包问题、最长公共子序列、斐波那契数列等。 6. **贪心算法**:贪心算法在每一步选择中都采取在当前...
- 动态规划:用于解决具有重叠子问题和最优子结构的问题,如背包问题、最长公共子序列等。 - 回溯与分支限界:用于在庞大的搜索空间中寻找解决方案,如八皇后问题、N皇后问题等。 3. **算法实现与应用**: - ...