题解 | #旋转位置的特定牛# java
旋转位置的特定牛
https://www.nowcoder.com/practice/4872ba1fef224bd382b49a5958d996ab
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param target int整型 * @return int整型 */ public int search (int[] nums, int target) { // write code here int left = 0, right = nums.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; } if (nums[mid] <= nums[left]) { if (target <= nums[left] && target > nums[mid]) { right = mid - 1; } else { left = mid + 1; } } else { if (target < nums[mid] && target >= nums[right]) { left = mid + 1; } else { right = mid - 1; } } } return -1; } }
编程语言是Java。
该题考察的知识点是二分查找。
代码的文字解释如下:
- left和right,分别表示查找范围的左边界和右边界,初始值分别为0和nums数组的长度减1。
- 二分查找,当左边界小于等于右边界时继续查找:计算中间位置mid = left + (right - left) / 2。如果中间位置的元素等于目标值target,则返回中间位置mid。如果中间位置的元素小于等于左边界位置的元素,表示mid及其左边是一个递减区间:如果目标值在[left, mid]范围内,将右边界更新为mid - 1,即在左侧递减区间中进行查找。否则,将左边界更新为mid + 1,即在右侧进行查找。如果中间位置的元素大于左边界位置的元素,表示左侧是一个递增区间:如果目标值在(mid, right]范围内,将左边界更新为mid + 1,即在右侧递增区间中进行查找。否则,将右边界更新为mid - 1,即在左侧进行查找。
- 如果未找到目标值,则返回-1。