关于leetCode中搜索旋转排序数组匹配题

在leetCode中刷到这个题时,刚开始不知道什么意思,在理解之后我发现只要找到数组中发生旋转的那个位置就很好做,从这个位置开始把数组分成两个部分,因为是升序数组,所以这两个部分就相当于两个升序数组,再用二分法查找就可以了。

用来旋转位置的函数

    private static int midSearch(int[] nums, int l, int r) {
		
		while(l<=r) {
			int mid=(l+r)>>1;
			if(mid+1<nums.length&&nums[mid]>=nums[0]&&nums[mid+1]<nums[0]) {
				return mid+1;
			}
			if(nums[mid]>=nums[0]) {
				l=mid+1;
			}else {
				r=mid-1;
			}
		}
		return nums.length-1;
	}

二分法查找:

 private static int searchCore(int[] nums, int l, int i, int target) {
		while(l<=i) {
			int mid=(l+i)>>1;
			if(nums[l]==target) {
				return l;
			}
			if(nums[i]==target) {
				return i;
			}
			if(nums[mid]==target) {
				return mid;
			}else if(nums[mid]<target){
				l=mid+1;
			}else {
				i=mid-1;
			}
		}
		return -1;
	}

主函数:

public int search(int[] nums, int target) {
        if(nums==null||nums.length==0){
	           return -1;
	      }else if(nums.length==1){
	           return nums[0]==target?0:-1;
	      }
		 int l=0,r=nums.length-1;
		 int a=midSearch(nums,l,r);
        if(target==nums[r]) {
			 return r;
		 }
		 if(target>=nums[0]) {
			 return searchCore(nums,l,a-1,target);
		 }else {
			 return searchCore(nums,a,r,target);
		 }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值