• 最大值减去最小值小于或等于num的子数组数量


    【说明】:

      本文是左程云老师所著的《程序员面试代码指南》第一章中“最大值减去最小值小于或等于num的子数组数量”这一题目的C++复现。

      本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。

      感谢左程云老师的支持。

    【题目】:

      给定数组 arr 和整数 num,共返回多少个字数组满足如下情况:

      max(arr[i...j]) - min(arr[i...j]) <= num

      max(arr[i...j]) 表示字数组 arr[i...j] 中的最大值,min(arr[i...j]) 表示子数组 arr[i...j] 中的最小值。

     【思路】:

      1、若 arr[i...j] 满足条件,那么其子数组也会满足条件;

      2、若 arr[i...j] 不满组条件,那么包含arr[i...j]的数组都不满足条件;

    【编译环境】:

      CentOS6.7(x86_64)

      gcc 4.4.7

     【实现】:

      实现及测试代码:

     1 /*
     2  *文件名:getSatisfiedSubArrNum.cpp
     3  *作者:
     4  *摘要:找到满足条件的子数组的数量
     5  */
     6 
     7 #include <iostream>
     8 #include <deque>
     9 
    10 using namespace std;
    11 
    12 int getNum(int arr[],int len,int num)
    13 {
    14     if(NULL == arr || 0 >= len)
    15         return 0;
    16     deque<int> qmin;    //qmin的第一个数据总是当前数组中最小的数据的位置
    17     deque<int> qmax;    //qmax的第一个数据总是当前数组中最大的数据的位置
    18     
    19     int i(0),j(0),res(0);
    20     while(i < len)
    21     {
    22         while(i < len)
    23         {
    24             while(!qmin.empty() && arr[qmin.front()] >= arr[j])
    25                 qmin.pop_back();
    26             qmin.push_back(j);
    27 
    28             while(!qmax.empty() && arr[qmax.front() <= arr[j]])
    29                 qmax.pop_back();
    30             qmax.push_back(j);
    31 
    32             if(arr[qmax.front()] - arr[qmin.front()] > num)
    33                 break;    //
    34             j++;
    35         }
    36         res += j-i;    //记录当前序列中满足要求的字数组数量
    37         
    38         if(qmin.front() == i)
    39             qmin.pop_front();
    40         if(qmax.front() == i)
    41             qmax.pop_front();
    42         i++;    //下移        
    43     }
    44     return res;
    45 }
    46 
    47 int main()
    48 {
    49     int a[] = {3,2,5,1,4,7,8,6};
    50     cout << "The number of sub arrays to meet the requirements is: " << getNum(a,8,4)<< endl;
    51 
    52     return 0;
    53 }
    View Code

    注:

      转载请注明出处;

      转载请注明源思路来自于左程云老师的《程序员代码面试指南》

  • 相关阅读:
    学习曲线
    正则化——“偏差(bias)”与“方差(variance)”
    诊断偏差(bias)和方差(variance)
    模型选择和训练/验证/测试数据集
    运用机器学习的建议
    训练神经网络的一般步骤
    Java数组
    类型信息(反射,RTTI)
    equals(), "== ",hashcode() 详细解释
    java并发
  • 原文地址:https://www.cnblogs.com/PrimeLife/p/5349058.html
Copyright © 2020-2023  润新知