面试算法 最长连续递增序列 (贪心算法)

1.题目:最长连续递增序列
给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。
序列的下标是连续的。。


2.算法:

1.暴力算法 
2. 贪心算法 


3.算法思想:

暴力算法:
1.首先建立一个循环,在这个循环中我们从每一个数开始寻找他的最长的递增的子数列
2.从每个数开始的查询子数列的方法,
3.首先建立while 循环  我们的在  while 循环里面  一直查看这个数,与之后的数 相比,看这个数小于之后那个数
4. 所以时间复杂度 为  O(n2) 

 

贪心算法 
    思想就是  
1.我只管你的开始位置,
    2.每当我运行到一个位置,我就做一次比较,比较我现在的最大的递增子数列是多大,因为我们记住了,开始的 坐标所以我们知道递增的长度,=i - start +1;
    3.每当我们的循环的这个坐标的数 ,在数组里面的值,小于之前哪一个,我们就更改开始的坐标。
    4.再次运行,直到循环结束 


4.贪心算法的标准解释:

贪心算法(greedy algorithm [8]  ,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解   。

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。

贪心算法一般按如下步骤进行: 

①建立数学模型来描述问题 。

②把求解的问题分成若干个子问题 。

③对每个子问题求解,得到子问题的局部最优解  。

④把子问题的解局部最优解合成原来解问题的一个解  。

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯   。


代码:

/*************************************************
作者:She001
时间:2022/8/29
题目:最长连续递增序列
给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。
序列的下标是连续的


算法:
1.暴力算法 
2. 贪心算法 

***************************************************/

#include<bits/stdc++.h>
using namespace std;


//暴力算法
//算法思想 :
/*
1.首先建立一个循环,在这个循环中我们从每一个数开始寻找他的最长的递增的子数列
2.从每个数开始的查询子数列的方法,
3.首先建立while 循环  我们的在  while 循环里面  一直查看这个数,与之后的数 相比,看这个数小于之后那个数
4. 所以时间复杂度 为  O(n2) 
*/ 

int fangfa_1(int num[],int n)//num int 类型的数组, n  数组的元素个数的多少
{
	int i,j,sum=0,max=0;
	for(i=0;i<n;i++)
	{
		j=i;
		sum=1;//开始就算把自己算上去 
		while(j<n)
		{
			if(num[j]<num[j+1])//比较大小 
			{
				//cout<<num[j]<<"    ";
				sum++;//把下一个算上去 
				j++; 
				if(max<sum)//长度的对比 
				{
					max=sum;//比max大 就赋值 
				}
				if(j==n-1)//强制退出  //防止访问不属于自己的空间 
				{
					//cout<<num[j]<<"  ";
					//sum++;
				//	cout<<"sum =  "<<sum<<endl; //打出最后一个数字 
					break;
				}
			}
			else
			{
				//cout<<num[j]<<"  ";
				//sum++;
				if(max<sum)
				{
					max=sum;
				}
			//	cout<<"sum =  "<<sum<<endl; 
				break;
			}
		}
		//cout<<endl<<endl;;
	}
	return max;
} 

//2.贪心算法 
/*
	他的思想就是  
	1.我只管你的开始位置,
	2.每当我运行到一个位置,我就做一次比较,比较我现在的最大的递增子数列是多大,因为我们记住了,开始的 坐标所以我们知道递增的长度,=i - start +1;
	3.每当我们的循环的这个坐标的数 ,在数组里面的值,小于之前哪一个,我们就更改开始的坐标。
	4.再次运行,直到循环结束 


*/

int fangfa_2(int num[],int n) //num int 类型的数组, n  数组的元素个数的多少
{
	int start=0;//标记从哪个地方开始 查找 
	int max=0,sum=0;
	for(int i=1;i<n;i++)//i=1  为了防止访问不属于数组的空间 //他只循环了一次 
	{
		if(num[i]<=num[i-1])
		{
			start=i;
		}
		sum=i-start+1;
		if(max<sum)
		{
			max=sum;
		}
	}
	return max; 
}






int main()
{
	int num[]={1,2,3,2,3,4,5,6,4,5,6,7,8,9,10,1,3,5,6};
	int a=fangfa_1(num,19);
	cout<<"a= "<<a<<endl;
	
	int b=fangfa_2(num,19);
	cout<<"b= "<<b<<endl;
	
	
	
	return 0;	
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值