题意:要在一个排好序的但是旋转过的序列中找给定的数字。
(通常的题目是,比如:1,2,3,4,5,6,7.找这组序列中是否有7这个数,但是这个
序列在这个题目中是旋转过的,但是按哪个位置旋转不知道,比如旋转后是:4,5,6,7,1,2,3.
要在这个序列中找7,题目就要求我们写算法来找是否有这个数字)
我的思路:
直接遍历一遍,O(n)复杂度-_-。
其他方法:
比如有如下的旋转后的序列:
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
将rotate后的排列分为前后两部分,前半部分是较大的数集,后半部分是较小的数集
例如上面的排列中,
前半部分:12, 13, 14, 15, 16, 17, 18, 19, 20, 21
后半部分:2, 3, 4, 5, 6, 7, 8, 9, 10, 11
因为旋转了,所以nums[0]头部位置很重要
几种情况 num[ mid ] & target
1. > nums[0] && target > nums[0] : 表明在同一部分中
2. < nums[0] && target > nums[0] : +F target > nums[0]说明target在前半部分,mid < nums[0]说明
mid是后半部分的数,不考虑,因此,当前位置数置为+F
3. > nums[0] && target < nums[0] : -F target < nums[0]说明target在后面,mid > nums[0]说明
从0到mid位都是大于taget的数字,当前位置数置为-F
(通常的题目是,比如:1,2,3,4,5,6,7.找这组序列中是否有7这个数,但是这个
序列在这个题目中是旋转过的,但是按哪个位置旋转不知道,比如旋转后是:4,5,6,7,1,2,3.
要在这个序列中找7,题目就要求我们写算法来找是否有这个数字)
我的思路:
直接遍历一遍,O(n)复杂度-_-。
其他方法:
比如有如下的旋转后的序列:
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
找7
将序列变成:
[-F, -F, -F, -F, -F, -F, -F, -F, -F, -F, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
如果是找16,序列变成:
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 2, +F, +F,+F, +F,+F, +F,+F, +F,+F, +F]。
抓住trick : 小的在后面,大的在前面,根据特点将某数字变为负无穷或者正无穷,然后再用二分法。将rotate后的排列分为前后两部分,前半部分是较大的数集,后半部分是较小的数集
例如上面的排列中,
前半部分:12, 13, 14, 15, 16, 17, 18, 19, 20, 21
后半部分:2, 3, 4, 5, 6, 7, 8, 9, 10, 11
因为旋转了,所以nums[0]头部位置很重要
几种情况 num[ mid ] & target
1. > nums[0] && target > nums[0] : 表明在同一部分中
2. < nums[0] && target > nums[0] : +F target > nums[0]说明target在前半部分,mid < nums[0]说明
mid是后半部分的数,不考虑,因此,当前位置数置为+F
3. > nums[0] && target < nums[0] : -F target < nums[0]说明target在后面,mid > nums[0]说明
从0到mid位都是大于taget的数字,当前位置数置为-F
4. < nums[0] && target < nums[0] : 表明在同一部分中
代码:略