`
jahu
  • 浏览: 61291 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

一个算法题目,

 
阅读更多

题目很简单,就是在在山峰,之间找出,可以填物的空间

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-数据结构与算法题目集.zip

    PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 ...

    算法设计题集_算法题目_

    总的来说,无论你是刚接触算法的新手,还是希望进一步提高自己算法水平的开发者,《算法设计题集》都是一个不可或缺的参考资料。通过解决书中的问题,你将能更好地理解和应用这些重要的算法,从而在实际工作和学习中...

    JAVA算法编程题目及答案.doc

    JAVA算法编程题目及答案 本资源提供了50道JAVA算法编程题目及答案,涵盖了算法设计、数据结构、程序设计等多个方面的知识点。...这些题目旨在帮助学习者提高编程能力和算法设计能力,为他们提供了一个良好的学习资源。

    c++ 经典算法题目

    本资源是一个C++经典算法题目集,涵盖了多种算法类型,包括基本算法、数字算法、字符串算法等。该资源来自学校内部的资料,是学习C++编程的非常有价值的参考资料。 算法1:A+B Problem 该算法的问题是计算两个整数...

    python算法趣味题目

    本文将介绍并解析两道有趣的Python算法题目,旨在帮助读者更好地理解Python语言的特点及其在处理字符串方面的优势。通过具体的示例代码,我们将深入探讨Python如何以简洁而高效的方式解决实际问题。 #### 题目1:...

    经典算法题目

    本资源集合了一些经典算法题目,虽然部分答案不全,但它们的价值在于提供了一个学习和实践的平台,鼓励我们通过动手编程来提升自己的算法思维和实现技巧。 首先,入门必做题.doc是一份精心挑选的初级算法题目集,它...

    PTA习题:数据结构与算法题目集1

    这是一道典型的链表操作题目,要求实现一个函数`Reverse`来逆转给定的单链表。在链表中,每个节点包含数据和指向下一个节点的指针。逆转链表意味着将原来的前后关系颠倒,使原链表的最后一个节点成为新链表的第一个...

    各个大厂算法题目大全

    无论是初创公司还是大型科技巨头,面试时都会对候选人进行算法和数据结构的考察,因为这是衡量一个程序员技术实力的重要标准。 1. **数据结构**:数据结构是组织和管理大量数据的方式,包括数组、链表、栈、队列、...

    经典算法题目与答案-含代码

    本书《经典算法题目与答案-含代码》是一本集成了多种编程语言的算法题目的资料书籍,覆盖了基础数据结构、排序算法、基础算法、数学问题解决以及编码相关问题。其中,数据结构部分包括字符串、链表、二叉树、哈夫曼...

    算法题目集锦.pdf

    《算法题目集锦》作为一本专注于算法设计与程序设计的资料,对于那些志在提高编程技能和算法能力的学习者而言,无疑是一份宝贵的学习资源。 在算法初步部分,书中首先从理论上阐释了算法的重要性。算法可以被视作...

    2017年华为算法比赛题目

    例如,可能会有题目要求设计一个高效的查找或排序算法,这时理解并熟练运用二分查找、快速排序、归并排序等核心算法就显得尤为重要。 算法设计则可能涵盖动态规划、贪心策略、回溯法、分支限界、图论算法等。比如,...

    C++算法题目仓库.zip

    C++算法题目仓库.zip是一个包含C++算法题目和解答的压缩文件。该资源可以帮助学习C++的学生和开发者提高算法和编程能力,通过练习这些题目来加深对C++语言和算法的理解。 内容概要: 该压缩文件包含多个C++算法题目...

    PTA数据结构与算法题目集部分题解,补充blog创建前的题解.zip

    PTA数据结构与算法题目集部分题解,补充blog创建前的题解 PTA数据结构与算法题目集部分题解,补充blog创建前的题解 PTA数据结构与算法题目集部分题解,补充blog创建前的题解 PTA数据结构与算法题目集部分题解,补充...

    java经典算法90 题目

    在解答这些Java经典算法题目时,除了掌握算法本身,还需要关注代码的可读性、可维护性和效率。通过不断实践,开发者可以提升自己的编程技巧,为解决实际工作中的复杂问题打下坚实的基础。因此,无论是初学者还是经验...

    C语言经典算法题目及答案.pdf

    在提供的文件内容中,我们可以识别出几个C语言的算法题目,并提炼出相关的知识点。以下是针对每个算法题目的知识点详细说明: 1. 三个数不重复输出问题: 此题目的要点是编写一个程序,输出1到4之间所有不重复的三...

    一个关于Dijkstra算法的题目

    Dijkstra算法是图论中的一个重要算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,主要用于解决单源最短路径问题。在这个特定的题目中,我们可能面临的是在一个带权有向或无向图中,找出从起点到其他所有顶点...

    程序设计题目(用算法设计)

    一个良好的算法应该是清晰、高效且具有可读性。在面对程序设计题目时,我们首先需要理解问题的需求,然后选择适合的算法策略,如分治法、动态规划、贪心算法或回溯法等。 数据结构的选择对于算法的效率至关重要。...

    LeetCode每日一题高频面试算法题目1

    本资源是一个 LeetCode 高频面试算法题目集合,包括队列实现栈、反转单链表、合并两个排序数组等多个算法题目。 1. 队列实现栈: 在该题目中,我们使用了两个队列来实现栈的功能。队列是 First-In-First-Out(FIFO...

Global site tag (gtag.js) - Google Analytics