求一個先升序后降序得數組的最大值
使用遍歷的方式,時間復雜度最大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; } }