查找二叉树的变种
题目:将一个升序数组从中间某个位置进行旋转((i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).)
对旋转后的数组进行目标target的查找,找到就返回该值在数组中的下标,否则返回-1主要思路:给定的数组只有一个“旋转点”,因此mid=(low + high)/2能将数组分成左右两部分,其中一部分是有序的。在有序的部分,判断target和边界的大小,可以确定target是否在该部分。(主要还是“二分”的思想,只不过需要判断target与边界的大小关系)
代码:
public int search(int[] nums, int target) { if(nums.length == 0){ return -1; } if(nums.length == 1){ if(nums[0] == target){ return 0; }else{ return -1; } } int low = 0; int high = nums.length - 1; while(low <= high){ int mid = low + (high - low)/2; if(nums[mid] == target){ return mid; }else{ //如果mid对应的值小于high对应的值,则说明右半边是有序的;否则左半边有序 if(nums[mid] <= nums[high]){ if(target > nums[mid] && target <= nums[high]){ low = mid + 1; }else{ high = mid - 1; } }else{ if(target >= nums[low] && target < nums[mid]){ high = mid - 1; }else{ low = mid + 1; } } } } return -1; }
其他方法参考链接(递归+分类讨论的方法):
http://blog.csdn.net/ljiabin/article/details/40453607