题目很简单,就是在在山峰,之间找出,可以填物的空间
package shu; import java.util.ArrayList ; import java.util.List ; import org.junit.Test ; public class Twitter { @Test public void twitterTest(){ twitter(new int[]{9,7,8,6,7,5,6,4,5}); twitter(new int[]{5,4,6,5,7,6,8,7,9}); twitter(new int[]{10,8,12,10,14,12,16,14,18}); twitter(new int[]{2,5,1,2,3,4,7,7,6}); twitter(new int[]{2,5,1,3,1,2,1,7,7,6}); twitter(new int[]{6,1,4,6,7,5,1,6,4}); twitter(new int[]{9,6,1,2,3,4,50,1,9}); } public void twitter(int[] in){ int inLeng = in.length-1; if( inLeng < 2){ System.out.println("墙少于3个,不无组成凹点") ; return; } // i 是循环数, inOne ,inTwo ,inTree 一次取三个才能拿比较出一个高峰 //listSize 高峰多少 subscript定位 高峰的下标, mainPeak 最高峰巅峰的高度,mainSub 最高峰的下标 int i = 2 , inOne = in[0],inTwo = in[1] , inThree = in[2] ,listSize ,subscript=1, mainPeak = 0 , mainSub = -1; List<TwitterClass> list = new ArrayList<>(inLeng - inLeng/3);//原数组的三分之二大小。因为怕遇到2121212这样的蛋疼的 TwitterClass twOne,twTwo = null; if(inOne > inTwo){//如果第一个墙比第二个墙高,那么这个就是峰 twOne = new TwitterClass(0, inOne); mainPeak = inOne; mainSub = 1; inOne = inTwo; inTwo = inThree; subscript = 2; inThree = in[++i]; list.add(twOne); } if(in[inLeng] > in[inLeng-1]){//如果最后一个墙比最后第二个墙高,那么这个就是峰,因为是最后一个不需要进行标记等 twTwo = new TwitterClass(inLeng, in[inLeng]); } inLeng = inLeng -1; for( ; ;){ if(inOne < inTwo && inTwo >= inThree ){ if(inThree == inTwo){ subscript++; } twOne = new TwitterClass(subscript, inTwo); list.add(twOne); if(mainPeak < inTwo){ mainPeak = inTwo; mainSub = list.size(); } } if(i == inLeng){ if(inTwo < inThree){//最后2 3个,不需要在次循环验证。这里处理 if(twTwo == null){//如果有twTwo 那么最后二个不是高峰 twTwo = new TwitterClass(i, inThree); } } if(twTwo!=null){//这里把最后一个峰加入,同时,确定是不是巅峰 list.add(twTwo); if(mainPeak < twTwo.getValues()){ mainPeak = twTwo.getValues(); mainSub = list.size(); } } break; } inOne = inTwo; inTwo = inThree; subscript++; inThree = in[++i]; } //System.out.println(list.toString()) ; listSize = list.size(); if( listSize <2){ System.out.println("高峰小于两个,不存在凹点") ; return; } List<TwitterClass> listTwo; boolean bx =false ; if(listSize > 2){//这里是排除两做高峰的中的低峰 比如 7 3 2 2 7 ,3 2 2是低峰。需要排除 List<TwitterClass> listThree = null; boolean b = true;//用区别,峰的规则,fasle是递增和递减。true就是中峰 if( mainSub == 1){//最后高峰是第一个,那么高峰高度是递减,所以,需要从最后个高峰(也就是最低的高峰)开始计算,里面的参数是初始化循环需要的参数 i = listSize-1; listSize = 0; mainPeak = -1; b = false; bx =true; }else{ mainPeak = 1; i = 0; if( mainSub == listSize){//最后 b = false; } listSize = listSize- 1; } listTwo = new ArrayList<>(list.size()); twOne = list.get( i ); listTwo.add(twOne); for( ; ; ){ i=i+ mainPeak; if(b){ if( i == mainSub){//当遇到,中峰的巅峰,需要使用递减的规则进行计算 listTwo.add(list.get(mainSub-1)); i = listSize; listSize = mainSub; mainPeak = -1; listThree = listTwo; listTwo = new ArrayList<>(list.size()); listTwo.add(list.get(list.size()-1)); b = false; //bx = true; } }else{//这里是排除低峰 twTwo = list.get( i ); if(twOne.getValues() < twTwo.getValues()){ listTwo.add(twTwo); } } if( i == listSize) break; twOne = twTwo; } if(listThree != null){//因为中峰使用同时使用了递增和递减,所有需要整合下 listThree.addAll(listTwo); listTwo = listThree; //bx = false; } }else{ listTwo = list; } list = null; //System.out.println(listTwo.toString()) ; i =0; twOne = listTwo.get(i++); listSize = listTwo.size(); inThree = 0; int start = twOne.getSubscript(), end , zhong = 1, daShu =0, inValue = 0; if(bx){ zhong = -1; } inOne = twOne.getValues(); start = start +zhong; for( ; ;){ twTwo = listTwo.get(i++); inTwo =twTwo.getValues(); end = twTwo.getSubscript(); if(inOne > inTwo){ subscript = inTwo ; daShu = inOne; }else{ subscript = inOne; daShu = inTwo; } for( ; ;){ inValue = in[start]; if( inValue < daShu){ inThree = inThree + subscript - inValue; } start = start +zhong; if(start == end ) break; } if( i == listSize) break; start = end + zhong; inOne = inTwo; } System.out.println(inThree) ; } static final class TwitterClass{ private int subscript; private int values; public TwitterClass(int subscript , int values){ this.subscript = subscript; this.values = values; } public int getSubscript() { return subscript ; } public void setSubscript(int subscript) { this.subscript = subscript ; } public int getValues() { return values ; } public void setValues(int values) { this.values = values ; } public String toString(){ StringBuilder sb = new StringBuilder(); sb.append("subscript = "); sb.append(this.subscript); sb.append(" values = "); sb.append(this.values); sb.append("\n"); return sb.toString(); } } } /* * for( ; ;){ if(inOne <= inTwo){ if(inTwo >= inThree ){ if(inThree == inTwo){ subscript++; } twOne = new TwitterClass(subscript, inTwo); list.add(twOne); }else{ if(i == inLeng){ break; }else if(i == inLeng -1){ if(twTwo != null){ } } } }else{ if(i == inLeng){ break; } inOne = inTwo; inTwo = inThree; subscript++; inThree = in[++i]; } } */
空间。
相关推荐
PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 ...
总的来说,无论你是刚接触算法的新手,还是希望进一步提高自己算法水平的开发者,《算法设计题集》都是一个不可或缺的参考资料。通过解决书中的问题,你将能更好地理解和应用这些重要的算法,从而在实际工作和学习中...
JAVA算法编程题目及答案 本资源提供了50道JAVA算法编程题目及答案,涵盖了算法设计、数据结构、程序设计等多个方面的知识点。...这些题目旨在帮助学习者提高编程能力和算法设计能力,为他们提供了一个良好的学习资源。
本资源是一个C++经典算法题目集,涵盖了多种算法类型,包括基本算法、数字算法、字符串算法等。该资源来自学校内部的资料,是学习C++编程的非常有价值的参考资料。 算法1:A+B Problem 该算法的问题是计算两个整数...
本文将介绍并解析两道有趣的Python算法题目,旨在帮助读者更好地理解Python语言的特点及其在处理字符串方面的优势。通过具体的示例代码,我们将深入探讨Python如何以简洁而高效的方式解决实际问题。 #### 题目1:...
本资源集合了一些经典算法题目,虽然部分答案不全,但它们的价值在于提供了一个学习和实践的平台,鼓励我们通过动手编程来提升自己的算法思维和实现技巧。 首先,入门必做题.doc是一份精心挑选的初级算法题目集,它...
这是一道典型的链表操作题目,要求实现一个函数`Reverse`来逆转给定的单链表。在链表中,每个节点包含数据和指向下一个节点的指针。逆转链表意味着将原来的前后关系颠倒,使原链表的最后一个节点成为新链表的第一个...
无论是初创公司还是大型科技巨头,面试时都会对候选人进行算法和数据结构的考察,因为这是衡量一个程序员技术实力的重要标准。 1. **数据结构**:数据结构是组织和管理大量数据的方式,包括数组、链表、栈、队列、...
本书《经典算法题目与答案-含代码》是一本集成了多种编程语言的算法题目的资料书籍,覆盖了基础数据结构、排序算法、基础算法、数学问题解决以及编码相关问题。其中,数据结构部分包括字符串、链表、二叉树、哈夫曼...
《算法题目集锦》作为一本专注于算法设计与程序设计的资料,对于那些志在提高编程技能和算法能力的学习者而言,无疑是一份宝贵的学习资源。 在算法初步部分,书中首先从理论上阐释了算法的重要性。算法可以被视作...
例如,可能会有题目要求设计一个高效的查找或排序算法,这时理解并熟练运用二分查找、快速排序、归并排序等核心算法就显得尤为重要。 算法设计则可能涵盖动态规划、贪心策略、回溯法、分支限界、图论算法等。比如,...
C++算法题目仓库.zip是一个包含C++算法题目和解答的压缩文件。该资源可以帮助学习C++的学生和开发者提高算法和编程能力,通过练习这些题目来加深对C++语言和算法的理解。 内容概要: 该压缩文件包含多个C++算法题目...
PTA数据结构与算法题目集部分题解,补充blog创建前的题解 PTA数据结构与算法题目集部分题解,补充blog创建前的题解 PTA数据结构与算法题目集部分题解,补充blog创建前的题解 PTA数据结构与算法题目集部分题解,补充...
在解答这些Java经典算法题目时,除了掌握算法本身,还需要关注代码的可读性、可维护性和效率。通过不断实践,开发者可以提升自己的编程技巧,为解决实际工作中的复杂问题打下坚实的基础。因此,无论是初学者还是经验...
在提供的文件内容中,我们可以识别出几个C语言的算法题目,并提炼出相关的知识点。以下是针对每个算法题目的知识点详细说明: 1. 三个数不重复输出问题: 此题目的要点是编写一个程序,输出1到4之间所有不重复的三...
Dijkstra算法是图论中的一个重要算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,主要用于解决单源最短路径问题。在这个特定的题目中,我们可能面临的是在一个带权有向或无向图中,找出从起点到其他所有顶点...
一个良好的算法应该是清晰、高效且具有可读性。在面对程序设计题目时,我们首先需要理解问题的需求,然后选择适合的算法策略,如分治法、动态规划、贪心算法或回溯法等。 数据结构的选择对于算法的效率至关重要。...
本资源是一个 LeetCode 高频面试算法题目集合,包括队列实现栈、反转单链表、合并两个排序数组等多个算法题目。 1. 队列实现栈: 在该题目中,我们使用了两个队列来实现栈的功能。队列是 First-In-First-Out(FIFO...