题目:有一个长度为 n 的按严格升序排列的整数数组 nums ,在实行 search 函数之前,在某个下标 k 上进行旋转,使数组变为[nums[k],nums[k+1],.....,nums[nums.length-1],nums[0],nums[1],.......,nums[k-1]]。给定旋转后的数组 nums 和一个整型 target ,请你查找 target 是否存在于 nums 数组中并返回其下标(从0开始计数),如果不存在请返回-1。数据范围: 1000000≤n≤10000,0≤target≤100000要求:空间复杂度 O(1) ,时间复杂度 O(n)
//简单查找import java.util.*;public class Solution {    /**     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可     *     *      * @param nums int整型一维数组      * @param target int整型      * @return int整型     */    public int search (int[] nums, int target) {        for(int i=0;i<=nums.length-1;i++){          if(nums[i] == target){              return i;          }          }        return -1;    }}
二分查找分析:如果给定的数组是排序好的数组,那么直接用二分法查找即可。但所给的数组是排序数组旋转后的数组,由两部分有序的部分组成。是否可以用二分法?既然所给的数组修改了一下,那么也对二分查找进行修改一下。假设从left到k,k+1到right为两个有序部分,mid一定位于(left,k)(k+1,right)两个区间之内,那么(left,mid)和(mid,right)这两个区间必定有一个是有序的,我们可以通过比较numsp[left]和nums[mid],nums[right]之间的大小关系得到那个区间有序假设(left,mid)这段区间有序,如果有target>mid,那么区间(left,mid)就应该被舍弃,下一步搜索区间为(mid+1,right)如果targetarget,区间(left,mid)也应该被舍弃,下一步搜索区间为(mid+1,right)如果target
//二分查找import java.util.*;public class Solution {    /**     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可     *     *      * @param nums int整型一维数组      * @param target int整型      * @return int整型     */    public int search (int[] nums, int target) {         int left = 0,right = nums.length-1;    int mid;    while(left<=right){        mid = left+(right-left)/2;        if(nums[mid]==target){            return mid;        }        if(nums[mid]>=nums[left]){            //如果从left到mid有序            if(target>nums[mid]||(targetnums[mid]&&target>nums[right])){                right = mid;            }            else{                left = mid+1;            }        }    }    return -1;    }}