局部最小值

  • 题目
    • 在一个无序数组中, 值有可能正, 负, 或者零, 数组中任由两个相邻的数一定不相等.
      定义局部最小:
      1.长度为1,arr[0]就是局部最小;
      2.数组的开头,如果arr[0] < arr[1] ,arr[0]被定义为局部最小。
      3.数组的结尾,如果arr[N-1] < arr[N-2] ,arr[N-1]被定义为局部最小。
      任何一个中间位置i, 即数组下标1~N-2之间, 必须满足arr[i-1] < arr[i] <arr[i+1] ,叫找到一个局部最小。
      请找到任意一个局部最小并返回。
  • 思路:整个数组只要返回一个arr[i]。满足arr[i- 1]>arr[i]<arr[i+ 1] 就行。
    -如果对每个位置判断一遍,O(N)。没必要
  • 思路:构造左右高,中间存在低的造型就行
  • L>L+1………min………R-1<R
  • 因为跟数组中相对位置无关,所以不用边界遍历去往内推。直接二分减少可能性
public static int getLessIndex(int[] arr) {
  //排除边界情况
		if (arr == null || arr.length == 0) {
			return -1; // no exist
		}
		if (arr.length == 1 || arr[0] < arr[1]) {
			return 0;
		}
		if (arr[arr.length - 1] < arr[arr.length - 2]) {
			return arr.length - 1;
		}
  //定端点
		int left = 1;
		int right = arr.length - 2;
		int mid = 0;
  //
		while (left < right) {
			mid = (left + right) / 2;
			if (arr[mid] > arr[mid - 1]) {
				right = mid - 1;
			} else if (arr[mid] > arr[mid + 1]) {
				left = mid + 1;
          } else {
				return mid;
			}
		}
		return left;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值