C++得到一个数组的最大递减数组({3,9,4,5,0}得到结果是{9,4,0})

#include <iostream>
using namespace std;

template <typename T>
struct Node
{
	T data;
	Node *link;
	Node():data(T()),link(NULL){}
};

template<typename T>
struct M_Node
{
	Node<T> *adj;//保存节点指针.
	T data;	//保存当前递减数字个数.
};

template<typename T>
class HashList
{
	public:
	HashList(int n)
	{
		node = new M_Node<T>[n];
		for(int i=0;i<n;i++)
		{
			node[i].data = 0;//递减节点个数都初始化为0.
		}
		size = n;
	}
	void Init(int a[])
	{
		for(int i=0;i<size;i++)
		{
			Node<T> *s = new Node<T>();
			s->data = a[i];
			node[i].adj = s;
		}
	}//将数组中的每一个数字都当作一个开始节点。
	void Insert(int start,int end,int a[])
	{
		Node<T> *p = node[start].adj;
		for(int i=start+1;i<size;i++)
		{
		  Node<T> *q = NULL;
			while(p!=NULL)
			{
				q = p;
				p = p->link;
			}
			if(p==NULL && (q->data > a[i]))
			{
				Node<T> *s = new Node<T>();
				s->data = a[i];
				q->link = s;
				node[start].data++;
			}
			p=q;
		}//依次比较插入节点.
	}
	void Show()
	{
		int sum = 0;
		int j = 0;
		int i =0;
		for(;i<size;i++)
		{
			if(sum<node[i].data)
				{
					sum = node[i].data;
					j  = i;
				}
		}
		//得到递减节点数最多的下标.
	Node<T> *p = node[j].adj;
		while(p!=NULL)
		{
				cout<<p->data<<" ";
				p=p->link;
		}
		cout<<endl;
	}
	private:
	int size;
	M_Node<T> *node;
};
int main()
{
	int a[]={6,5,4,12,11,10,9,3,2,0,12,3,4,6};
	HashList<int> sh(14);
	sh.Init(a);
	for(int i=0;i<14;i++)
	{
			sh.Insert(i,14,a);
	}
	sh.Show();//12 11 10 9 3 2 0为输出结果.
	return 0;
}

时间: 2024-12-14 23:08:44

C++得到一个数组的最大递减数组({3,9,4,5,0}得到结果是{9,4,0})的相关文章

17、把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. eg: 输入 3 4 5 1 2 输出 1 思路:用二分法查找最小元素 三种情况: (1)rotateArray[mid] >rotateArray[high]: like:[x,x,x,6,x,x,2],此时最小数字一

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记

返回一个整数数组中最大子数组的和4

题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二维数组首尾相接,象个一条首尾相接带子一样. 3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 4 求所有子数组的和的最大值.要求时间复杂度为O(n). 设计思想 目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案 源代码 题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素

题目 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间. 思路一 寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中.如果哈希表中已经存在这个元素则说明这就是个重复元素.这种方法可以很方便的在O(n)时间内完成对重复元素的查找.可是题目要求在O(1)的空间.因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的.题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n

定义一个由整数组成的数组,然后输入一个整数X,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j

//定义一个由整数组成的数组,然后输入一个整数x,如果X不在此数组中,返回小于X的最大数的位置i和大于X的最小数的位置j: //若X在此数组中,则返回数组中这个数的位置. 源代码: #include<iostream> using namespace std; void main() { int array[]={1,2,3,4,5,6,7,89,45,32,56,78,12,43,90,19};//16个数字 int x; int max=array[0]; int min=array[0]

编写一个宏,实现判断数组a元素的个数

#include <iostream> using namespace std; #define TestArrayLengthA(A) sizeof(A)/sizeof(*A) #define TestArrayLengthB(B) sizeof(B)/sizeof(B[0]) //这样测出的是数组可以放多少个元素,比如Array[100],他返回的是100, //不论你初始化还是没有初始化 int TestArrayLength(T *a) { int count = 0; T *p =

求一个数组的最大子数组之和

题目: 输入一个一维整形数组,数组里有正数也有负数.一维数组首尾相接,像个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 代码: import java.util.Scanner; public class Array{ public static void main(String[] args) { System.out.print("请输入数组的长度N="); Scanner scan=new Scanner(Sys