原题链接:https://leetcode.com/problems/search-in-rotated-sorted-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,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.
Your algorithm's runtime complexity must be in the order of O(log n).
Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0 Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3 Output: -1
算法设计
package com.bean.algorithmbasic;
public class SearchInRotatedSortedArray {
public static int search(int[] nums, int target) {
for (int i=0;i<nums.length;i++){
if (nums[i]==target) return i;
if (target<nums[i]) break;
}a
for (int j=nums.length-1;j>=0;j--){
if (nums[j]==target) return j;
if (target>nums[j]) break;
}
return -1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int demo[]=new int[] {4,5,6,7,0,1,2};
int result=search(demo,0);
System.out.println("Result = "+result);
}
}
第2种算法设计
package com.bean.algorithmbasic;
public class SearchInRotatedSortedArray2 {
public static int search(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
// judge which array we should find, left array or right array
boolean inLeft = false;
if (target == nums[0]) {
return 0;
} else if (target > nums[0]) {
inLeft = true;
}
return find(nums, target, 0, nums.length - 1, inLeft);
}
private static int find(int[] nums, int target, int left, int right, boolean inLeft) {
if (left > right) {
return -1;
}
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
}
// if we should find in left array, bud the mid num is lower than the smallest
// in the left array
// It represents that the mid num is in the right array
// so we can reduce the range
if (inLeft && nums[mid] < nums[0]) {
return find(nums, target, left, mid - 1, inLeft);
}
// The same to before
if (!inLeft && nums[mid] > nums[nums.length - 1]) {
return find(nums, target, mid + 1, right, inLeft);
}
// In this, we can know
// nums in (left, right) is a sorted array
// so we can find target num by binary search.
if (target > nums[mid]) {
return find(nums, target, mid + 1, right, inLeft);
} else {
return find(nums, target, left, mid - 1, inLeft);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int demo[] = new int[] { 4, 5, 6, 7, 0, 1, 2 };
int result = search(demo, 0);
System.out.println("Result = " + result);
}
}