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


    转自: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 }
    复制代码
  • 相关阅读:
    高级算法(1):
    spark浅谈(3):
    linux学习笔记(1):
    数据分析之pandas(1)
    数据分析之期权
    数据分析之蒙特卡洛模拟
    未能加载文件或程序集"xxxxxx"或它的某一个依赖项
    未能映射路径"/"
    部署MVC项目ManagedPipelineHandler报错
    IIS记录
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4562644.html
Copyright © 2020-2023  润新知