/* * @lc app=leetcode id=33 lang=java * * [33] Search in Rotated Sorted Array */ // @lc code=start class Solution { public int search(int[] nums, int target) { if(nums == null ||nums.length == 0) { return -1; } int r; if(target >= nums[0]) { // find in ascending side r = searchInAscendingSide(nums, target); } else { // find in descending side r = searchInDescendingSide(nums, target); } return r; } private int searchInAscendingSide(int[] nums, int target) { int l = 0, r = nums.length-1, m; while(l<=r) { m = l + (r-l)/2; if(nums[m] == target) { return m; } else if(!isAscendingSide(m, nums)) { r = m -1; } else if(nums[m] < target) { l = m + 1; } else { r = m -1; } } return -1; } private int searchInDescendingSide(int[] nums, int target) { int l = 0, r = nums.length-1, m; while(l <= r) { m = l + (r-l)/2; if(nums[m] == target) { return m; } else if(isAscendingSide(m, nums)) { l = m + 1; } else if(nums[m] < target) { l = m + 1; } else { r = m - 1; } } return -1; } private boolean isAscendingSide(int i, int[] nums) { return nums[i]>=nums[0]; } } // @lc code=end