【LeetCode852】求山峰数组的峰顶

15 篇文章 0 订阅
/*
山峰数组arr,长度为n,满足以下性质:
 存在索引为p的数字,使得 arr[0] < arr[1] < ... < arr[p] > arr[p+1] > ... > arr[n-1]。
给定一个山峰数组,请求出其峰顶,要求时间复杂度为O(logn)。
注:假定给定的数组的一定是山峰数组
*/ 
extension Daily {
	static func test_leetcode852() {
		let nums = [1,2,4,6,9,13, 21, 24 ,30,5]
		Daily.leetcode852(nums)
	}
	
	static func leetcode852(_ nums: [Int]) {
		if nums.count < 3 {
			print("nums is invalid")
			return
		}
		
		var i = 0, j = nums.count - 1;
		var mid = (i + j)/2;
		var count = 0;
		while true {
			count += 1
			if count > nums.count {
				break
			}
			if nums[mid] > nums[mid-1] && nums[mid] < nums[mid+1] {
				i = mid
				mid = (i + j)/2; 
				continue;
			}
			if nums[mid] < nums[mid-1] && nums[mid] > nums[mid+1] {
				j = mid
				mid = (i + j)/2;
				continue;
			}
			print("峰顶=\(mid), 值=\(nums[mid]) ")
			break
		}
		print("----- 结束 \(count)")
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值