首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >计数有界切片密码

计数有界切片密码
EN

Stack Overflow用户
提问于 2014-01-20 23:22:44
回答 6查看 12.2K关注 0票数 13

我最近参加了一个密码编程测试,问题是如何在数组中找到有界切片的数目。

我只是简单地解释一下这个问题。

如果Max(SliceArray)-Min(SliceArray)<=K,则表示数组的一个切片是有界的。

如果数组3,5,6,7,3和K=2提供。有界切片的数目是9,

数组中的第一片(0,0) =3 Max(0,0)=3 Max-Min<=K结果0<=2,因此它是有界切片

数组中的第二片(0,1) =3 Max(0,1)=5 Max-Min<=K结果2<=2,因此它是有界切片

数组Min(0,1)=3 Max (0,2) =6 Max-Min<=K结果3<=2中的第二片(0,2),因此它不是有界切片

通过这种方式,您可以发现有九个有界的切片。

(0,0),(0,1),(1,1),(1,2),(2,2),(2,3),(3,3),(4,4)。

以下是我提供的解决方案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private int FindBoundSlice(int K, int[] A)
{
    int BoundSlice=0;
    Stack<int> MinStack = new Stack<int>();
    Stack<int> MaxStack = new Stack<int>();




    for (int p = 0; p < A.Length; p++)
    {
        MinStack.Push(A[p]);
        MaxStack.Push(A[p]);
        for (int q = p; q < A.Length; q++)
        {
            if (IsPairBoundedSlice(K, A[p], A[q], MinStack, MaxStack))
                BoundSlice++;
            else
                break;
        }
    }

    return BoundSlice;
}

private bool IsPairBoundedSlice(int K, int P, int Q,Stack<int> Min,Stack<int> Max)
{
    if (Min.Peek() > P)
    {
        Min.Pop();
        Min.Push(P);
    }

    if (Min.Peek() > Q)
    {
        Min.Pop();
        Min.Push(Q);
    }

    if (Max.Peek() < P)
    {
        Max.Pop();
        Max.Push(P);
    }

    if (Max.Peek() < Q)
    {
        Max.Pop();
        Max.Push(Q);
    }

    if (Max.Peek() - Min.Peek() <= K)
        return true;
    else
        return false;
}

但是,根据密码审查,上述解运行在O(N^2)中,有人能帮助我找到运行在O(N)中的解吗?

最大时间复杂度允许O(N)。最大空间复杂度允许O(N)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-01-21 02:12:31

提示

其他人解释了基本算法,即根据最大和最小之间的当前差值,保持2个指针并提前开始或结束。

移动结束时很容易更新最大值和最小值。

然而,这个问题的主要挑战是如何在移动开始时进行更新。大多数堆或平衡的树结构将花费O(logn)更新,并将导致整体O(nlogn)复杂性过高。

为及时做到这一点,O(n):

  1. 提前结束直到超过允许的阈值。
  2. 然后从这个关键位置向后循环,在数组中存储一个累积值,以便在当前结束和当前启动之间的每个位置上达到最小值和最大值。
  3. 现在,您可以从更新的min/max值的数组中提升开始指针并立即查找。
  4. 您可以继续使用这些数组来更新start,直到start达到临界位置。此时返回到步骤1,并生成一组新的查找值。

总的来说,这个过程只对每个元素进行一次反向工作,所以总复杂度是O(n)。

示例

对于K为4的序列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
4,1,2,3,4,5,6,10,12

第一步向前推进,直到我们超过界限。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start,4,1,2,3,4,5,end,6,10,12

步骤2从端到端向后工作,计算数组MAX和MIN。MAXi是从i到结束的所有元素的最大值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Data = start,4,1,2,3,4,5,end,6,10,12
MAX  = start,5,5,5,5,5,5,critical point=end -
MIN  = start,1,1,2,3,4,5,critical point=end -

步骤3现在可以提前、启动并立即查找范围内最小的最大值和最小值,开始到临界点。

这些可以与范围临界点到终点的最大/分钟相结合,以找到范围开始到结束的总体最大/分钟。

PYTHON代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def count_bounded_slices(A,k):
    if len(A)==0:
        return 0
    t=0
    inf = max(abs(a) for a in A)
    left=0
    right=0
    left_lows = [inf]*len(A)
    left_highs = [-inf]*len(A)
    critical = 0
    right_low = inf
    right_high = -inf
    # Loop invariant
    #  t counts number of bounded slices A[a:b] with a<left
    #  left_lows[i] is defined for values in range(left,critical)
    #    and contains the min of A[left:critical]
    #  left_highs[i] contains the max of A[left:critical]
    #  right_low is the minimum of A[critical:right]
    #  right_high is the maximum of A[critical:right]
    while left<len(A):
        # Extend right as far as possible
        while right<len(A) and max(left_highs[left],max(right_high,A[right]))-min(left_lows[left],min(right_low,A[right]))<=k:
            right_low = min(right_low,A[right])
            right_high = max(right_high,A[right])
            right+=1    
        # Now we know that any slice starting at left and ending before right will satisfy the constraints
        t += right-left
        # If we are at the critical position we need to extend our left arrays
        if left==critical:
            critical=right
            left_low = inf
            left_high = -inf
            for x in range(critical-1,left,-1):
                left_low = min(left_low,A[x])
                left_high = max(left_high,A[x])
                left_lows[x] = left_low
                left_highs[x] = left_high
            right_low = inf
            right_high = -inf
        left+=1
    return t

A = [3,5,6,7,3]
print count_bounded_slices(A,2)
票数 1
EN

Stack Overflow用户

发布于 2015-10-26 14:20:57

现在,仁慈释放他们的黄金解与O(N)的时间和空间。https://codility.com/media/train/solution-count-bounded-slices.pdf

如果你看完pdf后还很困惑,就像我一样.这是一个很好的解释

pdf中的解决方案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def boundedSlicesGolden(K, A):
N = len(A)

maxQ = [0] * (N + 1)
posmaxQ = [0] * (N + 1)
minQ = [0] * (N + 1)
posminQ = [0] * (N + 1)

firstMax, lastMax = 0, -1
firstMin, lastMin = 0, -1
j, result = 0, 0

for i in xrange(N):
    while (j < N):
        # added new maximum element
        while (lastMax >= firstMax and maxQ[lastMax] <= A[j]):
            lastMax -= 1
        lastMax += 1
        maxQ[lastMax] = A[j]
        posmaxQ[lastMax] = j

        # added new minimum element
        while (lastMin >= firstMin and minQ[lastMin] >= A[j]):
            lastMin -= 1
        lastMin += 1
        minQ[lastMin] = A[j]
        posminQ[lastMin] = j

        if (maxQ[firstMax] - minQ[firstMin] <= K):
            j += 1
        else:
            break
    result += (j - i)
    if result >= maxINT:
        return maxINT
    if posminQ[firstMin] == i:
        firstMin += 1
    if posmaxQ[firstMax] == i:
        firstMax += 1
return result
票数 2
EN

Stack Overflow用户

发布于 2014-01-21 01:56:13

以下是我解决这个问题的尝试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- you start with p and q form position 0, min =max =0;
- loop until p = q = N-1
- as long as max-min<=k advance q and increment number of bounded slides.
- if max-min >k advance p
- you need to keep track of 2x min/max values because when you advance p, you might remove one  or both of the min/max values
- each time you advance p or q update min/max

如果你想的话,我可以写代码,但我认为这个想法很明确.

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21251707

复制
相关文章
你应该使用 Python 管理 Cron 作业
在本教程中,您将了解 cron 作业的重要性以及为什么需要它们。你可以看一下 python-crontab,这是一个与 crontab 交互的 Python 模块。您将学习如何使用 python-crontab 模块,使用 Python 程序操作 cron 作业。 如果大家感兴趣,请一定点个关注,给我一些动力,谢谢大家 -- 原文地址:https://code.tutsplus.com/tutorials/managing-cron-jobs-using-python--cms-28231 推荐星级:✨✨✨
临书
2018/03/07
2.7K0
PHP轻量级作业调度器 Cron Scheduler
过去,你可能需要在服务器上为每一个调度任务去创建 Cron 条目。因为这些任务的调度不是通过代码控制的,你要查看或新增任务调度都需要通过 SSH 远程登录到服务器上去操作,所以这种方式很快会让人变得痛苦不堪。
Tinywan
2024/04/15
2530
PHP轻量级作业调度器 Cron Scheduler
Cron在Centos上的安装方法
Centos最小化安装时候貌似crond是不带的,需要自己手动安装。但是Centos不同的版本安装命令不一样,在此记录一下!
老高的技术博客
2022/12/28
8230
WordPress 教程:在 WordPress 中如何设置定时作业
我们知道 Linux 服务器有个 Cron 的功能,可以用来设置定时执行的作业,但是并不是每个人都熟悉 Linux 系统,并且也不是所有的主机管理面板都有 Cron 栏目。
Denis
2023/04/13
2.4K0
WordPress 教程:在 WordPress 中如何设置定时作业
传美国考虑全面封杀华为,所有许可申请都将被拒绝
据彭博社报道,随着美国政府加大对中国科技行业的打击力度,拜登政府正在考虑切断华为技术有限公司与其所有美国供应商的联系,包括英特尔公司和高通公司。
芯智讯
2023/02/09
3020
Slack如何将Cron转换为分布式作业调度程序
告别单点故障!Slack 如何用 Kubernetes 和 Go 将传统 Cron 升级为分布式作业调度器?利用 Kafka 消息队列和现有 Monster Job Execution Service,实现 Cron 脚本的可靠执行和监控。巧妙的 Leader Election 机制,保证系统高可用。云原生架构助力 Slack 轻松应对海量任务,运维效率 Up!
云云众生s
2025/03/15
430
Slack如何将Cron转换为分布式作业调度程序
cron
msfvenom -p cmd/unix/reverse_bash LHOST=172.18.13.90 LPORT=9898 -f raw > shell.shuse exploit/multi/handlerset payload cmd/unix/reverse_netcatset lhost 172.18.13.90set lport 9797exploit -juse exploit/linux/local/cron_persistenceset target 2set payload cmd/
浪子云
2022/07/06
1K0
Cron应用
Corn表达式是一个字符串,分为6个或者7个部分(年可以不加),每个部分代表的意义如表所示:
muntainyang
2020/10/23
1.3K0
GAE Python中的 Cron Job 失败
在 Google App Engine (GAE) 上,Python 应用中的 Cron Job 失败可能有多种原因。以下是排查和解决 GAE Cron Job 失败的详细步骤:
华科云商小徐
2024/12/02
700
在Windows server 2008 中拒绝共享资源用户的本地登录
有时服务器的打印机或文件需要共享,这时我们可以在本地用户和组中新建一个用户,局域网内的其他人可通过这个用户帐户来共享打印机,这时问题出现了,任何人掌握了这个帐户就可以用这个帐户在本地登录你的电脑,这确实很危险。
拓荒者
2019/03/11
1.1K0
Cron运行原理
本文介绍的是由Paul Vixie开发的运行在SuSE Linux上的Cron。可以通过“man cron”进行确认。
一见
2018/08/10
4K0
Cron运行原理
在hue上部署spark作业
【文章链接】 https://cloud.tencent.com/developer/article/2466071
七条猫
2024/11/16
790
在hue上部署spark作业
Apache Doris在作业帮实时数仓中的应用实践
在Java里经常会判断一个对象是否为空,如果为空的对象访问方法,字段会抛出空指针异常,而空指针异常为运行异常,如果不抓取这个异常,有的时候会导致程序异常,为了解决这个问题,我们通常会在代码里显式的去判断该对象是否为空,进行为空的逻辑处理,这种做法逻辑虽然明确,但是由于空的逻辑并不是经常碰到,这样会导致有多余的逻辑分支判断。
王知无-import_bigdata
2020/11/06
1.3K0
Apache Doris在作业帮实时数仓中的应用实践
在 Dapr 中使用 Cron 绑定的计划任务
我昨天写了一篇关于在微服务应用程序中采用Dapr的好处的文章《从服务之间的调用来看 我们为什么需要Dapr》[1], 在那篇文章中,我们专注于"服务调用"构建块 [2]。在这篇文章中,我想向你展现一个特别有用的功能,它是由"绑定"构建块[3]实现的。
张善友
2022/03/30
1.3K0
linux中的11个cron调度任务示例
Crontab 文件每行由命令组成,实际上有六个字段,并以空格或制表符分隔。前五个字段代表运行任务的时间,最后一个字段用于命令。 * * * * * - - - - - | | | | | | | | | +----- 星期中星期几 (0 - 6) (星期天 为0) | | | +---------- 月份 (1 - 12) | | +--------------- 一个月中的第几
入门笔记
2022/06/02
1.6K0
如何在 Linux 中列出 Cron 定时任务
本文最先发布在:https://www.itcoder.tech/posts/how-to-list-cron-jobs-in-linux/
雪梦科技
2020/05/25
14.4K0
如何在 Linux 中列出 Cron  定时任务
组件分享之后端组件——任务管理组件包cron
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/03/06
5900
定时任务框架中 Cron表达式
月份和星期的名称是不区分大小写的。FRI 和 fri 是一样的。 域之间有空格分隔
用户9006224
2022/12/21
5810
cron表达式如何在SpringBoot中应用
计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的任务。
青衫染红尘
2021/01/19
1.2K0
cron表达式如何在SpringBoot中应用
cron和crontab
crontab -l 列出目前的计划任务(时程表) crontab -e 编辑计划任务 计划任务的格式如下: f1 f2 f3 f4 f5 program 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示
千往
2018/01/24
1.2K0

相似问题

拒绝许可

10

在cron作业中的SFTP

10

拒绝许可.?

40

CRON不运行任务,因为"/bin/bash: /var/log/cron.log:许可权被拒绝“

10

在rc.local中拒绝许可

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文