经典最长平台算法
已知一个已经从小到大排序的数组,这个数组中的一个平台(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语言编程能力,还能培养良好的问题解决思维。在实际项目中,了解何时以及如何运用这些算法至关重要,这将直接影响程序的效率和可维护性。因此,无论是为了学术...
在数据与算法的领域中,解决数列的最长递增子序列问题一直是一个核心议题。它不仅在理论上具有重要的地位,更在实际应用中发挥着关键作用。在EE课程中,我们通过实验报告的形式,深入探讨了如何通过动态规划方法来...
《数据结构算法——Visual C++ 6.0程序集》是一部专为学习和实践数据结构与算法设计的书籍,特别适合使用C++编程语言的读者。本书通过Visual C++ 6.0这一经典开发环境,提供了丰富的实例代码,旨在帮助读者深入理解...
- 替换策略是移除最长时间未被访问的页面。 3. **缺页统计**: - 每当发生一次页面替换,即表示发生了一次缺页。 - 缺页次数通过变量`u`来累计。 4. **输出结果**: - 输出每一时刻内存中的页面状态。 - 输出...
经典动态规划问题包括最长公共子序列、背包问题、最短路径问题(如Dijkstra算法)、矩阵链乘法等。它们在计算机科学和工程领域有广泛的应用,如网络流量优化、资源分配、生物信息学分析等。 总结来说,动态规划是一...
5. **动态规划**:动态规划是一种用于求解最优化问题的方法,适用于解决有重叠子问题和最优子结构性质的问题,如背包问题、最长公共子序列、斐波那契数列等。 6. **贪心算法**:贪心算法在每一步选择中都采取在当前...
- 动态规划:用于解决具有重叠子问题和最优子结构的问题,如背包问题、最长公共子序列等。 - 回溯与分支限界:用于在庞大的搜索空间中寻找解决方案,如八皇后问题、N皇后问题等。 3. **算法实现与应用**: - ...