学习目标:
力扣第33题:搜索旋转排序数组
学习内容:
给你一个升序排列的整数数组 nums ,和一个整数 target 。
假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:
输入:nums = [1], target = 0
输出:-1
这么多字的中心意思就是在目标数组中找到target,当然也可以直接for循环查找,但是时间复杂的会变成O(n),而题目要求算法时间复杂度必须是 O(logn) 的级别
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
学习时间:
2020年11月1日
学习产出:
/**
*
* @Function: Test.java
* @Description: 二分法:左右指针,因为是螺旋数组,mid是中间值,所以要么mid左边是有序的,要么mid右边是有序的
* 如果mid左边有序:如果left下标的值小于target且mid下标的值大于target,则将right指针指向mid-1,否则left指向mid-1
* 如果mid右边有序:如果mid下标的值小于target且right下标的值大于target,则将left指针指向mid+1,否则right指向mid-1
* 每次的指针变化都会更新mid的值,通过不断二分直到找到目标元素
*
* @param: left:左指针 right:右指针 mid:中间值
* @return:有target返回结果mid,否则返回-1
* @throws:异常描述
*
* @version: v1.0.0
* @author: 童一
* @date: 2020年11月2日 上午12:49:24
*
* Modification History:
* Date Author Version Description
*----------------------------------------------------------------*
* 2020年11月2日 童一 v1.0.0 修改原因
*/
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[left] <= nums[mid]) {
if (nums[left] <= target && nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
if (nums[mid] < target && nums[right] >= target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}