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.,
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.
二、求解思路
因为排过序的数组有可能旋转过,因此必须先通过算法求解出旋转点,然后判断目标值是落在旋转点的左侧还是右侧,再求解
三、代码
论坛里的另一种解法:
另外,该题目的要求是数组中不存在重复元素,如果存在重复元素
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e.,
0 1 2 4 5 6 7might 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; } }
另外,该题目的要求是数组中不存在重复元素,如果存在重复元素
相关文章推荐
- LeetCode --- 33. Search in Rotated Sorted Array
- [Leetcode] 33. Search in Rotated Sorted Array
- leetcode 33 -- Search in Rotated Sorted Array
- Search in Rotated Sorted Array - LeetCode 33
- [leetcode 33]Search in Rotated Sorted Array
- 33.search in rotated sorted array leetcode java
- leetcode 33: Search in Rotated Sorted Array
- [leetcode-33]Search in Rotated Sorted Array(C)
- leetcode 33 Search in Rotated Sorted Array
- LeetCode 33 — Search in Rotated Sorted Array(C++ Java Python)
- leetcode[33]Search in Rotated Sorted Array
- [Leetcode 33, Hard] Search in Rotated Sorted Array
- LeetCode(33)Search in Rotated Sorted Array
- [leetcode 33] Search in Rotated Sorted Array
- LeetCode 33 Search in Rotated Sorted Array 二叉查找(三)
- Leetcode[33]-Search in Rotated Sorted Array
- LeetCode(33)Search in Rotated Sorted Array
- LeetCode(33)Search in Rotated Sorted Array
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
- LeetCode 33, Search in Rotated Sorted Array-----Binary Search