title: leetcode-33-搜索旋转排序数组(java)
date: 2019-09-09 20:51:56
categories:
- leetcode
tags: - leetcode
搜索旋转排序数组(java)
-
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例 2:输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 -
解法一:速度快的,但是算法复杂度达不到目的
class Solution { public int search(int[] nums, int target) { if(nums.length==0) return -1; int left = 0; int right = nums.length-1; while (left<right){ if (nums[right]==target) { return right; }else { right--; } if (nums[left]==target) return left; else left++; } return nums[left]==target?left:-1; } }
-
解法二:时间复杂度达到目的,但是测试速度跟不上第一的解法,但是也不差多少
class Solution { //二分搜索,第一次,找到最小的数字 第二次判断首字母 //二分搜索,第一次,找到最小的数字 第二次判断首字母 public int search(int[] nums,int target){ if (nums.length == 0 ) return -1; if(nums.length == 1) return nums[0]==target?0:-1; int min = findMin(nums); int len = nums.length-1; if(nums[len]>target) return find(nums,min,len,target); else if (nums[len]<target) return find(nums,0,min,target); else return len; } public int find(int[] nums,int left,int right,int target){ while (left<=right){ int mid = (left+right)/2; if(nums[mid]>target) right = mid-1; else if(nums[mid]<target) left = mid+1; else return mid; } return -1; } public int findMin(int [] nums){ int left = 0; int right = nums.length-1; if (nums[left]<nums[right]) return 0; while (left<=right){ int mid = (left+right)/2; if(nums[mid]>nums[mid+1]) return mid+1; else { if(nums[mid]<nums[left]) right = mid - 1; else left = mid+1; } } return 0; } }