算法题——数组内有序对的最大距离

转自:http://www.cnblogs.com/qieerbushejinshikelou/p/3916958.html

题目:给定一个数组A,对于下标i < j,有A[i] < A[j],求j - i 的最大值。

思路:先正序遍历一次,利用一个辅助数组,记录每个元素的左边子数组中最小值的下标;然后倒序遍历,维持两个指针,初始都指向最后一个元素,通过移动两个指针,找出最大距离。

学习之处:对于解决算法复杂度过高的问题,往往可以通过增加辅助空间,辅助空间有两种方式,一种方式是用Hashtable,另外一种方式是通过记录历史信息,之前的最大值啊,之前的最小值啊。

代码

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 int maxDist(int num[], int n)
 6 {
 7     if(n < 2)
 8         return 0;
 9 
10     vector<int> left_min_pos(n, 0);
11     int cur_min_pos = 0;
12     int max_dist = 0;
13 
14     for(int i = 1; i < n; ++i)
15     {
16         if(num[i] < num[cur_min_pos])
17         {
18             left_min_pos[i] = i;
19             cur_min_pos = i;
20         }
21         else
22         {
23             left_min_pos[i] = cur_min_pos;
24         }
25     }
26 
27     for(int i = n - 1, j = n - 1; i >= 0; )  //i < j
28     {
29         i = left_min_pos[i];
30         
31         if(num[j] >= num[i])    //找到一个有序对,或是同一个元素
32         {
33             if(j - i > max_dist) 
34             {
35                 max_dist = j - i;
36             }
37             --i;            //对于当前的i来说,j已是最远的,所以固定住j,i往左走,找到更大的j-i
38         }
39         else
40         {
41             --j;            //不是有序对,对于j来说,上一个i已是最远的,固定住i,j往左走
42         }
43     }
44 
45     return max_dist;
46 }
47 
48 int main()
49 {
50     const int n = 5;
51     int num[n] = {3, 6, 4, 1, 2};
52 
53     cout << maxDist(num, n) << endl;
54 
55     return 0;
56 }
复制代码
原文地址:https://www.cnblogs.com/sunshisonghit/p/4562644.html