小米面试算法题:求一个先升序后降序得数组的最大值
求一个先升序后降序得数组的最大值
使用遍历的方式,时间复杂度最大O(N),只需要把当前节点和前一个节点、后一个节点进行比较。如果比前一个节点大,也比后一个节点大,那么就是要找的数据。如果数组小于3或者找不到这样的数,返回-1.
//使用遍历O(n)的时间复杂度 int findPeak(int nums[]){ if(nums==null||nums.length<3){ return -1; } for(int i=1;i<nums.length-1;i++){ if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]){ return nums[i]; } } return -1; }
使用logn的时间复杂度的二分查找算法:
package com.andy.arithmetic; public class FindMax { public static void main(String[] args) { int[] nums={1,2,3,4,5,6,5,4,3,2,1}; int peak = new FindMax().findPeak(nums); int i = new FindMax().binarySearchPeak(nums); System.out.println(peak); System.out.println(i); } //使用遍历O(n)的时间复杂度 int findPeak(int nums[]){ if(nums==null||nums.length<3){ return -1; } for(int i=1;i<nums.length-1;i++){ if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]){ return nums[i]; } } return -1; } //二分查找的方式 int binarySearchPeak(int arr[]) { int left=0; int right=arr.length-1; while(left<=right){ int mid=(left+right)>>>1; if(mid==0||mid==arr.length-1){ return -1; } if(arr[mid-1]<arr[mid]&&arr[mid]>arr[mid+1]){ return arr[mid]; }else if(arr[mid-1]<arr[mid]&&arr[mid+1]>arr[mid]){ left=mid+1; }else if(arr[mid-1]>arr[mid]&&arr[mid]>arr[mid+1]){ right=mid-1; } } return -1; } }