如题:
我们有一个数组A
它相邻两个数的差的绝对值为1
如{1,2,3,4,3,2,3,4,5,4,5,6,7}
现在给定某一个数字t,求其在数组中的位置
1
初步分析:
最暴力的算法就是遍历数组一遍,拿每个元素去和目标元素比较,在O(n)的复杂度内解决问题。然而,我们发现,有一个条件没有使用到对吧,相邻两个数的差的绝对值为1.所以我们断定,这道题的复杂度可以比O(n)更低。大家可能会马上想到O(logn),二分查找对吧?问题是二分查找要求数组已排序,这道题显然没有排序,我们得看下,忽增忽减的数组中能不能做二分查找。当然,还有另外一种思路,我们来分解下问题,绝对值差为1有两个情况,我们先假设它是递增的。
1.递增数列,依次加1:二分查找肯定没有问题
2.递减数列,依次减1:二分查找也没有问题但是我们神奇的发现,如果它是依次递增或者递减的,其实根本就不用查找了。我们根据第一个元素就能找到目标值的位置,不是吗?假设第一个元素为a,目标值为T,他们相差T-a,所以T的下标就应该是T-a,也就是数组中第T-a+1个元素。当然刚才是在递增的情况下讨论的哈。
2
思考发现:我们好像发现了什么?假设第一个元素a小于T,我们按照T-a去取元素,和当前元素去比较,只会有两个结果:
1.正好相等,说明a到T之间恰好是上升的对吧。
2.假设不等,该位置的元素可能会比目标元素大吗?(不可能)只可能会小,因为我们是按照递增规律来找的,小了说明中间有过递减,甚至一直在递减,那我们怎么才能找到更大的呢?还假设它之后是递增的,我们往后移T-b位,假设b就是当前我们取到的元素,一直到找到为止。
!!!记住,刚才有一个假设很重要,第一段是上升的。如果第一个元素a本来就比T大呢,我们也要取a-T位置的数字对吧。
1.正好相等,说明这一段是下降的
2.不等,说明中间有上升,只能继续往后面,希望有下降的区间我们能找到目标元素
总结一下,从上述推理来看,就是不存在一种情况,从a位置到
a-T
位置中间会出现一个数NT
那我们一起来看下代码:我们一起来测试一下:
好了,大家如果有更好的解法,欢迎提出来我们一起讨论哈。也欢迎大家治好白癜风光疗费用白癜风有什么偏方治疗吗