#面试题#最长等差数列

#面试题#给定未排序的数组,请给出方法找到最长的等差数列。


分析: 想以O(n^2)的复杂度计算出任意两个位置的数字差。用hash数组存储:

比如1 3 2 4 5  的 hash统计结果为: (注意都是位置)

差为1: (1,3)  (2, 4)  (4, 5)

差为2: (1,2)  (3, 4)  (2, 5)

差为3: (1, 4)  (2, 5)

差为4: (1, 5)


之后 对每一条链表 遍历,用dp数组统计最长等差数列

比如 用第一个链表举例: 初始 dp = {1, 1, 1, 1, 1}

遇到(1, 3) 则dp[3] = dp[1] + 1   dp = {1, 1, 2, 1, 1}

遇到(2, 4) 则dp[4] = dp[2] + 1   dp = {1, 1, 2, 2, 1}

遇到(4, 5) 则dp[5] = dp[4] + 1   dp = {1, 1, 2, 2, 3}

最长等差数列 即为 3。


代码如下:

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
#include 
      
      
       
       
#define MAXN 100
using namespace std;
struct p{
    int left, right;
    struct p * next;
};
typedef map 
       
       
         mymap; int main() { int a[MAXN] = {0}; mymap m; // here should add an " " between two ">" int i = 1, j; while (cin >> a[i++]) { } int n = i; int dif; p* cur; for (i = n; i >= 1; i--) { for (j = i+1; j <= n; j++) { dif = a[j] - a[i]; if (m.find(dif) == m.end()) { m[dif] = (p*) malloc(sizeof(p)); m[dif] -> left = i; m[dif] -> right = j; m[dif] -> next = NULL; } else { cur = (p*) malloc (sizeof (p)); cur -> left = i; cur -> right = j; cur -> next = m[dif]; m[dif] = cur; } } } int max = 0; for (mymap::iterator it = m.begin(); it != m.end(); it++) { dif = it->first; int dp[MAXN]; for (i = 0; i < MAXN; i++) dp[i] = 1; for (cur = it -> second; cur != NULL; cur = cur -> next) { dp[cur -> right] = dp[cur -> left] + 1; if (dp[cur->right] > max) { max = dp[cur->right]; } } } cout << max << endl; } 
       
      
      
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值