题目:有一个长度为 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; }}