LeetCode刷题:33. Search in Rotated Sorted Array

原题链接:https://leetcode.com/problems/search-in-rotated-sorted-array/

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Your algorithm's runtime complexity must be in the order of O(log n).

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

算法设计

package com.bean.algorithmbasic;

public class SearchInRotatedSortedArray {
	
	public static int search(int[] nums, int target) {
        for (int i=0;i<nums.length;i++){
            if (nums[i]==target) return i;
            if (target<nums[i]) break;
        }a
        for (int j=nums.length-1;j>=0;j--){
            if (nums[j]==target) return j;
            if (target>nums[j]) break;
        }
        return -1;
    }

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int demo[]=new int[] {4,5,6,7,0,1,2};
		int result=search(demo,0);
		System.out.println("Result = "+result);
		
	}

}

 第2种算法设计

package com.bean.algorithmbasic;

public class SearchInRotatedSortedArray2 {

	public static int search(int[] nums, int target) {
		if (nums == null || nums.length == 0) {
			return -1;
		}

		// judge which array we should find, left array or right array
		boolean inLeft = false;
		if (target == nums[0]) {
			return 0;
		} else if (target > nums[0]) {
			inLeft = true;
		}

		return find(nums, target, 0, nums.length - 1, inLeft);
	}

	private static int find(int[] nums, int target, int left, int right, boolean inLeft) {
		if (left > right) {
			return -1;
		}

		int mid = (left + right) / 2;

		if (nums[mid] == target) {
			return mid;
		}

		// if we should find in left array, bud the mid num is lower than the smallest
		// in the left array
		// It represents that the mid num is in the right array
		// so we can reduce the range
		if (inLeft && nums[mid] < nums[0]) {
			return find(nums, target, left, mid - 1, inLeft);
		}

		// The same to before
		if (!inLeft && nums[mid] > nums[nums.length - 1]) {
			return find(nums, target, mid + 1, right, inLeft);
		}

		// In this, we can know
		// nums in (left, right) is a sorted array
		// so we can find target num by binary search.
		if (target > nums[mid]) {
			return find(nums, target, mid + 1, right, inLeft);

		} else {
			return find(nums, target, left, mid - 1, inLeft);

		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int demo[] = new int[] { 4, 5, 6, 7, 0, 1, 2 };
		int result = search(demo, 0);
		System.out.println("Result = " + result);

	}

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值