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;
}