Leetcode33题的理解---动笔就变得简单

题目:

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.

题目分析:

L(坐标)

M

h

 

 

 

该开始的时候是这样的,我们也不知道旋转点在哪里

接下来我们利用二分的思想,if(nums[m]

L

x

 

M

h

>nums[m]

 

 

>nums[m]&&

我们无非考虑的是l,h如何移动的问题

右边情况简单我们可以这样判断:

If(nums[m]target){

L=m+1;

}else{
h=m-1;

}

因为我们根据这两个只判断的所以首先判断这两个值是否满足条件,这种情况考虑完了,接下来考虑if(nums[m]>nums[l])这种情况,说明旋转点一定在m点的右侧,情况如下:

L

M

 

x

H

 

>nums[m]

 

这种情况下m点的右侧比较简单因此:

If(nums[m]>target&&nums[l]

H=m-1;

}else{

L=m+1;

}

在此之前还是需要对m 点和l点的值是否等于target值进行判断,综上所述情况分析完毕


当我看到这个题的时候,我的第一反应是用递归,写出来用的时间不长,但显然还应该有更好的办法,我当时就是没有画图,只是在自己脑中分析情况,就像捡了芝麻丢了西瓜,总是掉掉一些情况,浪费了很长的时间,因此还是动动笔头比较好,几分钟就搞定,第二种方法就是分析的结果,具体而言,我也不知道哪个方法好,但是我记录的目的,是想自己以后不要懒着动笔,只是一时的清楚是不好的.更加的浪费时间.

递归的方法:

class Solution {
    public int find(int[] nums,int target,int l,int h){
		int ret=-1;
		int m=l+(h-l)/2;
		if(nums[m]==target){
			return m;
		}
		if(l==h){
			return ret;
		}
		if(nums[l]>nums[h]){
			int t1=find(nums,target,l,m);
			int t2=find(nums,target,m+1,h);
			if(t1>t2){
				return t1;
			}else{
				return t2;
			}
		}else{
			if(nums[l]>target){
				return -1;
			}
			if(nums[h]=l){
				m=l+(h-l)/2;
				if(nums[m]>target){
					h=m-1;
				}else{
					if(nums[m]==target){
						return m;
					}
					l=m+1;
				}
			}
		}
		return ret;
	}
    public int search(int[] nums, int target) {
        
        int ret=-1;
        if(nums.length==0){
			return ret;
		}
		ret=this.find(nums, target, 0, nums.length-1);
		return ret;
    }
}

另一种


int ret=-1;
		if(nums.length==0){
			return ret;
		}
		int l=0;
		int h=nums.length-1;
		int m;
		while(h>=l){
			m=l+(h-l)/2;
			if(nums[m]>nums[l]){
				if(nums[m]==target){
					return m;
				}
				if(nums[l]==target){
					return l;
				}
				if(nums[l]target){
					h=m-1;
				}else{
					l=m+1;
				}
							
			}else{
				if(nums[m]==target){
					return m;
				}
				if(nums[h]==target){
					return h;
				}
				if(nums[h]>target&&nums[m]



你可能感兴趣的:(leetcode)