小米面試算法題:求一個先升序后降序得數組的最大值


 

求一個先升序后降序得數組的最大值

使用遍歷的方式,時間復雜度最大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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM