杭州哪家做网站好,网站建设公司运营经验,做网站的哪里好,邀请注册推广赚钱33. 搜索旋转排序数组
题目描述#xff1a;整数数组 nums 按升序排列#xff0c;数组中的值 互不相同 。
在传递给函数之前#xff0c;nums 在预先未知的某个下标 k#xff08;0 k nums.length#xff09;上进行了 旋转#xff0c;使数组变为 [nums[k], nums…33. 搜索旋转排序数组
题目描述整数数组 nums 按升序排列数组中的值 互不相同 。
在传递给函数之前nums 在预先未知的某个下标 k0 k nums.length上进行了 旋转使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]]下标 从 0 开始 计数。例如 [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你旋转后的数组 nums 和一个整数 target 如果 nums 中存在这个目标值 target 则返回它的下标否则返回 -1 。
考察重点二分查找
方法概括先遍历找到旋转位置前数组为原数组后半部分后数组为原数组前半部分根据target大小选择在哪个数组进行二分查找。
public int search(int[] nums, int target) {int left 0, right nums.length - 1;for (; left 1 right nums[left] nums[left 1]; left) {} //遍历找到旋转的起始位置//对于[4,5,6,7,0,1,2] left目前指向7right目前指向2if (left right) { // left right更新为记录待查找数组的左右边界left 0;} else if (nums[right] target) {left;} else { right left;left 0;}while (left right) {int mid left (right - right) / 2;if (nums[mid] target) {return mid;}if (target nums[mid]) {right mid - 1;}if (target nums[mid]) {left mid 1;}}return -1;
}