基于visual Studio2013解决面试题之1004最长等差数列





题目



解决代码及点评

/*
	求数组中最长的等差数列
	只需要遍历字符串即可
*/

#include <stdio.h>  
#include <iostream>  
using namespace std;  

const int N = 10;  
const int INVALID_IDX = -1;  

void show(int* a,int n)  
{  
	for (int i=0;i<n;++i)  
	{  
		cout<<a[i]<<",";  
	}  
	cout<<endl;  
}  

inline int compare(const void* p1,const void* p2)  
{  
	return *(int*)p1 - *(int*)p2;  
}  

void longest_seq(int* a)  
{  
	qsort(a,N,sizeof(int),&compare);  

	int R = a[N-1]-a[0]+1;  
	pair<int,int>** dp = new pair<int,int>*[R];  
	for (int i=0;i<R;++i)  
	{  
		pair<int,int>* row = new pair<int,int>[N];   
		for (int j=0;j<N;++j)  
		{  
			row[j].first = 0;       //记录当前最长数列的长度  
			row[j].second = INVALID_IDX;//记录与first相对应的等差数列的下一值在数组a中的索引  
		}  
		dp[i] = row;  
	}  

	int maxlen = 0;  
	int rowidx = INVALID_IDX;  
	int colidx = INVALID_IDX;  

	for (int i=N-2;i>=0;--i)  
	{  
		for (int j=i+1;j<N;++j)  
		{ 
			if (dp[ a[j]-a[i] ][i].first != 0) continue;    //以该差为行号的值如果已经存在,就不需要再为相同的差值更新  

			dp[ a[j]-a[i] ][i].first = dp[ a[j]-a[i] ][j].first + 1;  
			dp[ a[j]-a[i] ][i].second = j;  

			if (dp[ a[j]-a[i] ][i].first > maxlen)  
			{  
				maxlen = dp[ a[j]-a[i] ][i].first;  
				rowidx = a[j]-a[i];  
				colidx = i;  
			}  
		}  
	}  

	if( maxlen > 1 )  
	{  
		cout<<"The longest:"<<endl;  
		while( colidx != INVALID_IDX )  
		{  
			cout<<a[colidx]<<",";  
			colidx = dp[rowidx][colidx].second;  
		}  
		cout<<endl;  
	}  
	else  
	{  
		cout<<"0,0"<<endl;  
	}  

	for (int i=0;i<R;++i)  
		delete []dp[i];  

	delete []dp;  
}  


int main(void)  
{  
	int a[N] = {8, 8, 7, 4, 1, 3, 3, 1, 8, 4};  
	longest_seq(a);  
	system("pause");
	return 0;  
}  


代码下载及其运行

代码下载地址:http://download.csdn.net/detail/yincheng01/6704519

解压密码:c.itcast.cn


下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:

1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”


2)在下拉框中选择相应项目,项目名和博客编号一致

3)点击“本地Windows调试器”运行


程序运行结果








长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn