您的位置:首页 > 其它

LeetCode-33. Search in Rotated Sorted Array

2017-02-22 19:54 316 查看
一、问题描述

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e.,
0 1 2 4 5 6 7
might become
4 5 6 7 0 1 2
).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

二、求解思路

因为排过序的数组有可能旋转过,因此必须先通过算法求解出旋转点,然后判断目标值是落在旋转点的左侧还是右侧,再求解

三、代码

public class Solution {
public int search(int[] nums, int target) {
if(nums==null || nums.length<=0)
return -1;

if(nums[0]>nums[nums.length-1]){
int point=findPoint(nums,0,nums.length-1);
if(nums[0]==target)
return 0;
else if(nums[0]>target)
return findTarget(nums,target,point+1,nums.length-1);
else
return findTarget(nums,target,0,point);
}
else
return findTarget(nums,target,0,nums.length-1);
/*
if(nums[0]>nums[nums.length-1]){
for(int i=0;i<nums.length-1;i++){
if(nums[i]>nums[i+1]){
if(nums[0]==target)
return 0;
else if(nums[0]>target)
return findTarget(nums,target,i+1,nums.length-1);
else
return findTarget(nums,target,0,i);
}
}
return -1;
}else{
return findTarget(nums,target,0,nums.length-1);
}*/

}
public int findTarget(int[] nums,int target,int start,int end){
if(start==end && nums[end]==target)
return end;
else if(start==end)
return -1;
int middle=(start+end)/2;
if(nums[middle]==target)
return middle;
if(nums[middle]>target)
return findTarget(nums,target,start,middle);
else
return  findTarget(nums,target,middle+1,end);
}
public int findPoint(int[] nums,int start,int end){
if(start==end)
return start-1;
int middle=(end+start)/2;
if(nums[middle]>nums[end])
return findPoint(nums,middle+1,end);
else
return findPoint(nums,start,middle);
}
}

论坛里的另一种解法:

public int search(int[] nums, int target) {//应该先判断nums是否为null,并且长度是否<=0
int minIdx = findMinIdx(nums);
if (target == nums[minIdx]) return minIdx;
int m = nums.length;
int start = (target <= nums[m - 1]) ? minIdx : 0;
int end = (target > nums[m - 1]) ? minIdx : m - 1;

while (start <= end) {
int mid = start + (end - start) / 2;
if (nums[mid] == target) return mid;
else if (target > nums[mid]) start = mid + 1;
else end = mid - 1;
}
return -1;
}

public int findMinIdx(int[] nums) {
int start = 0, end = nums.length - 1;
while (start < end) {
int mid = start + (end -  start) / 2;
if (nums[mid] > nums[end]) start = mid + 1;
else end = mid;
}
return start;
}
自己又重新写了一遍:

class Solution {
public int search(int[] nums, int target) {
if(nums == null || nums.length == 0)
return -1;

if(nums[0] > nums[nums.length-1]){
int index = findPaviot(nums);
if(nums[0] == target){
return 0;
}else if(nums[0]>target){
return findTarget(nums,index,nums.length-1,target);
}else{
return findTarget(nums,0,index-1,target);
}
}
return findTarget(nums,0,nums.length-1,target);
}
private int findTarget(int[] nums,int left,int right,int target){
while(left<right){
int median = left + (right-left)/2;
if(nums[median] == target)
return median;
else if(nums[median]>target){
right = median;
}else
left = median+1;
}
if(nums[left]==target){
return left;
}
return -1;
}
private int findPaviot(int[] nums){
int left = 0;
int right = nums.length-1;
while(left<right){
int median = left + (right-left)/2;
if(nums[median]>=nums[0]){///如果只是>的话。3.1这种情况会出现错误解,因为我们是期望将index落在右半序列的第一个元素上,而不是左半的最后一个
left = median+1;
}else{
right = median;
}
}
return left;
}
}


另外,该题目的要求是数组中不存在重复元素,如果存在重复元素
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: