已序数组旋转后找target

已序数组旋转后找target

题目: 旋转后的已序数组【4 6 8 9 0 2 3】找target

思路

因为是已序后旋转,所以是一个类似已序的数组,在里面找target,肯定是二分查找了
但是要注意很多细节

方法1

情况1:

4 6 8 9 0 2 3
^     ^     ^
f    mid    l
  ^
target
arr[first] <= target && target < arr[mid]

情况2:

4 6 8 9 0 2 3
^         ^ ^
f       mid l
    ^
  target
arr[first] <= target && target > arr[mid] && arr[first] > arr[mid]

情况3:

4 6 8 9 0 2 3
^         ^ ^
f       mid l
        ^
      target
arr[first] > target && target < arr[mid] && arr[first] > arr[mid]

code

// 4 5 6 7 0 1 2 3
public class Search{

	public static void main(String args[]){
		int[] arr = {5,6,7,9,0,1,2,3};
		System.out.println(search(arr,9));
		System.out.println(search(arr,5));
		System.out.println(search(arr,6));
		System.out.println(search(arr,7));
		System.out.println(search(arr,0));
		System.out.println(search(arr,1));
		System.out.println(search(arr,2));
		System.out.println(search(arr,3));
		
		
		System.out.println(search(arr,4));
		System.out.println(search(arr,8));
		System.out.println(search(arr,-9));
		System.out.println("==================");
	}
	
	public static int search(int[] arr, int target){
		if(arr == null){
			return -1;
		}
		int first = 0;
		int last = arr.length - 1;

		while(first <= last){
			int mid = first + (last - first) / 2;
			if(arr[mid] == target){
				return mid;
			}else if((arr[first] <= target && target < arr[mid])
				|| (arr[first] <= target && target > arr[mid] && arr[first] > arr[mid])
				|| (arr[first] > target && target < arr[mid] && arr[first] > arr[mid])){
				last = mid - 1;
			}else{
				first = mid + 1;
			}
		}
		return -1;
	}
}

方法2

其实不论mid在哪里,一定都有一边是有序的

4 6 8 9 0 2 3
^     ^     ^
f    mid    l
已序
f - mid
4 6 8 9 0 2 3
^       ^   ^
f      mid  l
已序
mid - l

// 4 5 6 7 0 1 2 3
public class Search{

	public static void main(String args[]){
		int[] arr = {5,6,7,9,0,1,2,3};
		
		
		System.out.println(search2(arr,9));
		System.out.println(search2(arr,5));
		System.out.println(search2(arr,6));
		System.out.println(search2(arr,7));
		System.out.println(search2(arr,0));
		System.out.println(search2(arr,1));
		System.out.println(search2(arr,2));
		System.out.println(search2(arr,3));
								  
								  
		System.out.println(search2(arr,4));
		System.out.println(search2(arr,8));
		System.out.println(search2(arr,-9));
	}
	
	public static int search2(int[] arr, int target){
		if(arr == null){
			return -1;
		}
		int first = 0;
		int last = arr.length - 1;

		while(first <= last){
			int mid = first + (last - first) / 2;
			if(arr[mid] == target){
				return mid;
			}else{				
				if(arr[mid] > arr[first]){
					//前面有序
					if(arr[mid] > target && arr[first] <= target){
						last = mid - 1;
					}else{
						first = mid + 1;
					}
				}else{
					//后面有序
					if(arr[mid] < target && arr[last] >= target){
						first = mid + 1;
					}else{
						last = mid - 1;
					}
				}
			}
		}
		return -1;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 近序数组是指一个具有 n 个元素的数组,可以分为两个部分,且它的各个部分都是一个非严格有序数组。例如,数组 1、2、3、4、4、3、2、1 和数组 4、2、1、2、3、4 都是近序数组,但数组 1、5、7、3、9、3 不是近序数组有序数组是近序数组的特例,例如数组 1、3、3、4。 ### 回答2: 简单来说,近序数组就是由两个非严格有序数组组成的数组。严格有序指的是每个元素都满足从左到右/从小到大(或从大到小)的排列顺序,而非严格有序指的是元素之间可以相同。也就是说,在近序数组中,两个相同的元素之间可以存在其他元素。 那么如何判断一个数组是否为近序数组呢?我们可以通过对数组进行分割,看其分为的两部分是否都是非严格有序。比如,对于数组1、2、3、4、4、3、2、1,我们可以将其分为1、2、3、4和4、3、2、1两部分,两部分都是非严格有序,因此这是一个近序数组。 再比如,对于数组4、2、1、2、3、4,我们可以将其分为4、2、1和2、3、4两部分,同样都是非严格有序,所以这也是一个近序数组。 但是,对于数组1、5、7、3、9、3,我们无法将其分为两个非严格有序的部分,因此它不是近序数组。 近序数组的存在并不常见,但是有时会在具有特定性质的数据集中出现。它的性质与有序数组类似,但比有序数组更容易构造。对于一些算法问题,近序数组也可以作为输入数据,提供不同于有序数组的挑战性。 ### 回答3: 什么是近序数组? 近序数组是指一个具有n个元素的数组,可以将其分为两个部分,它的各个部分都是一个非严格有序数组数组。所谓非严格有序,就是数组中有重复元素,且重复元素可以放在任意位置,而不会影响数组的排序结果。 近序数组的特点 1. 可以被分为两个部分:一个是递增部分,一个是递减部分。 2. 数组中的元素可以存在重复。 3. 数组中的元素不一定要完全按照升序或降序排列,只是要求部分数组是非严格有序数组。 如何判断一个数组是否是近序数组? 判断一个数组是否是近序数组,需要根据其是否满足上述近序数组的特点来进行判断。 具体来说,我们可以遍历整个数组,将其分为两个部分,分别判断这两个部分是否为非严格有序数组即可。 在遍历过程中,需要注意处理重复元素的情况。一般来说,我们可以将重复元素视为相同的元素,将其放置在相同的位置上。 如果分成的两个部分均为非严格有序数组,则该数组为近序数组;否则,该数组不是近序数组。 近序数组的应用 近序数组的应用比较广泛。在算法题中,常常会出现要求处理近序数组的问题。比如,在处理搜索和排序问题时,近序数组可以为我们提供更多的信息,有助于提高算法的效率。 另外,在实际的应用场景中,也有一些问题可以转化为近序数组的处理问题。比如,在处理时间序列数据时,往往需要对数据进行排序和查等操作,此时可以将时间序列转化为近序数组,再进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值