zoukankan      html  css  js  c++  java
  • 算法题——数组内有序对的最大距离

    转自: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 }
    复制代码
  • 相关阅读:
    天梯赛5-12 愿天下有情人都是失散多年的兄妹 【dfs】
    poj2718 Smallest Difference【贪心】
    HDU problem 5635 LCP Array【思维】
    codeforces 782C Andryusha and Colored Balloons【构造】
    HDU 4278 Faulty Odometer【进制转换】
    codeforces B. The Meeting Place Cannot Be Changed【二分】
    POJ 3264 Balanced Lineup 【线段树】
    HDU 1850
    CodeForces-714C
    HDU Problem 1247 Hat's Words 【字典树】
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4562644.html
Copyright © 2011-2022 走看看