数组的波谷

###找数组的波谷

####原题

一个数组A[1…n],满足A[1]>=A[2], A[n] >= A[n-1]。A[i]被成为波谷,意味着:A[i-1] >= A[i] <= A[i+1]。请给出一个算法,找到数组中的一个波谷。O(n)的方法,是很直接,有更快的方法么?

####分析

这个题目遍历一遍数组,显然就可以找到全部的波谷。时间复杂度O(n),空间复杂度是O(1)。但是如果我们只需要找到一个波谷,是否有更快的方法呢?更快的方法O(1)是不可能的,那只有O(logn),自然就想到二分查找。这个题目如果进行二分呢?我们看下面的数组A:

0123456
9772137
leftmidright
A[0]>A[1],A[6]>A[5],满足题目中要求数组的条件。满足这样的条件,数组中一定是存在波谷的。假设不存在波谷,则A[0]

上表中的mid=3,A[mid]=2。A[mid-1]<A[mid]<A[mid+]。根据上面的分析,[mid, 6]一定有一个波谷。所以处理有半部分

0123456
9772137
leftmidright
此时,mid满足波谷的条件,找到波谷。

总结上面的思路,找到数组的mid元素,mid有几种情况:

  • 如果A[mid-1]>=A[mid] && A[mid+1]>=A[mid],找到波谷;
  • 如果A[mid-1]<=A[mid]<A[mid+1],right=mid,在左侧继续找;
  • 如果A[mid+1]<=A[mid]<A[mid-1],left=mid,在右侧继续找;
  • 如果A[mid-1]<A[mid] && A[mid+1]<A[mid],任意一侧都可以,任意一侧,都必将存在波谷。

####进一步分析

如果这个题目中,没有A[1]>=A[2]以及A[n]>=A[n-1]的约束,还能够以O(logn)的时间复杂度完成么?关键点就在于,中间的元素与其相邻的元素进行大小比较的时候,还能否选择一边继续进行查找。当A[mid-1]<=A[mid]时,可能是A[1]<A[2]<…<A[mid-1]<=A[mid]是不存在波谷的。所以,在左侧查找是找不到波谷的。所以,如果没有原题中的条件,两边都要进行遍历查找,我们的递归式应该是如下的形式:

T(n)=2T(n/2)+1

根据主定理,解得,时间复杂度为O(n).此时,是不存在O(logn)的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于字母"c",我们可以从多个角度进行回答。 首先,“c”是英文字母表中的第三个字母。它的发音类似于“西”,是一个辅音字母,而不是元音字母。在英语单词中,它可以以不同的发音出现,如在“cat”中发音为/k/,在“city”中发音为/s/,在“chocolate”中发音为/tʃ/等。此外,英文中还有一些特定的词汇和短语以字母"c"开头,如“car”(车)、“cat”(猫)、“computer”(电脑)等。 另外,对于计算机领域来说,字母“c”也有特殊的含义。它是一种编程语言,被广泛用于软件开发和系统编程。C语言由贝尔实验室的Dennis Ritchie在20世纪70年代早期开发,是一种结构化的、高级的程序设计语言。它具有强大的底层编程能力和广泛的应用领域,例如操作系统、编译器、数据库和网络等。 此外,字母“c”在化学元素周期表中也代表着碳元素(Carbon)。碳是地球上最常见的元素之一,它的原子号是6,原子量为12.01。碳的存在形式多样,可以形成各种化合物,用途广泛,如有机化学中的有机物、燃料燃烧生成的二氧化碳等。 总之,字母“c”在不同情境下具有不同的含义,无论是作为一个英文字母、一种编程语言还是一个化学元素,都承载着特定的意义和重要的用途。 ### 回答2: c是英文字母表的第三个字母,也是编程语言中的一种。在数学中,c通常表示一个常数,表示一个固定的值。在化学中,C是碳的化学符号。在物理中,c代表光速,也就是光在真空中传播的速度。在音乐中,C代表唱名Do。在计量学中,C代表摄氏度的单位。 在计算机科学中,C是一种高级编程语言,也是一种很强大的语言。它是由贝尔实验室于1972年开发的,主要是为了开发UNIX操作系统而设计的。C语言以其简洁、高效和强大的功能而闻名,被广泛用于系统开发、嵌入式系统和应用程序开发。 C语言具有很多特点,包括直接的内存访问、底层控制、高速执行等。它提供了丰富的数据类型,如整型、字符型、浮点型等,并且支持自定义数据类型的定义。C语言还提供了很多控制结构,如循环、条件和分支等,使得程序的逻辑结构清晰明了。 C语言也是学习其他高级编程语言的基础。许多编程语言都是以C语言为基础开发的,如C++、Java、Python等。因此,掌握C语言可以为学习其他编程语言打下坚实的基础。 总之,C语言是一种强大而广泛应用的编程语言,具有许多特点和能力。它是计算机科学中非常重要的一部分,对于学习编程和系统开发非常有帮助。 ### 回答3: 题目提供的信息太过简洁,无法理解您具体想获得什么样的回答。请提供更多详细的背景信息或明确您的问题,以便我能更好地回答您的疑问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值