旋转数组查找元素
-
旋转数组
数组:[0,1,2,3,4,5,6,7,8,9]
则[7,8,9,0,1,2,3,4,5,6]就是其旋转数组之一。 -
解决方法
利用数组有序,那么很容易想到二分查找
注意点就是如何判断左右边界点 -
代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 旋转数组(无重复)中找到指定值
def find_n(l_list, num):
right_pos = len(l_list) - 1
left_pos = 0
left_num = l_list[0]
right_num = l_list[right_pos]
pos_flag = None
# 确定num在旋转数组的前半段还是后半段
if num < left_num and num < right_num:
pos_flag = 'RIGHT'
elif num > left_num and num > right_num:
pos_flag = 'LEFT'
elif num == left_num:
return 0
elif num == right_num:
return right_pos
else:
return -1 # 没有答案
# 二分法查找
while(left_pos <= right_pos):
middle_pos = (left_pos+right_pos)/2
if num == l_list[middle_pos]:
return middle_pos
if pos_flag == 'LEFT':
if num < l_list[middle_pos]:
right_pos = middle_pos
elif num > l_list[middle_pos] and l_list[middle_pos] > right_num:
left_pos = middle_pos
elif num > l_list[middle_pos] and l_list[middle_pos] < right_num:
right_pos = middle_pos
else:
if num > l_list[middle_pos]:
left_pos = middle_pos
elif num < l_list[middle_pos] and l_list[middle_pos] < right_num:
right_pos = middle_pos
elif num < l_list[middle_pos] and l_list[middle_pos] > right_num:
left_pos = middle_pos
return -1