力扣第33题:搜索旋转排序数组

学习目标:

力扣第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;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值