java面試演算法題之遞增三元組子序列

來源:互聯網
上載者:User


給出一個無序的整數序列,返回是否存在遞增的三元組子序列。 如果存在 i, j, k 使得 arr[i]即返回true;如果不存在則返回false。

解法一

public static void main(String[] args) {

        int[] inputNums = { 6, 4, 3, 2, 4, 7, 1 };

        System.out.println(isExist(inputNums));

    }

public static boolean isExist(int[] inputNums) {
        if (inputNums.length < 2) {
            return false;
        }

        int smallestBefore = inputNums[0];
        boolean[] existSmallerArray = new boolean[inputNums.length];
        for (int i = 1; i < inputNums.length; i++) {
            if (inputNums[i] > smallestBefore) {
                existSmallerArray[i] = true;
            } else {
                smallestBefore = inputNums[i];
            }
        }

        int largestAfter = inputNums[inputNums.length - 1];
        for (int i = inputNums.length - 2; i >= 0; i--) {
            if (inputNums[i] < largestAfter && existSmallerArray[i]) {
                return true;
            }

            if (inputNums[i] >= largestAfter) {
                largestAfter = inputNums[i];
            }
        }

        return false;
    }
思路

這道題起先我使用的是暴力破解法,時間耗費的是 O(N3)。如果是需要找遞增的二元組的話完全可以使用 O(N)的遍曆方法,但是在解題中,第二個數和第三個數進行對比的前提是第二個數大於第一個數,而這個前提又是基於對數組的遍曆,所以形成了 O(N3)。

可以想到的最佳化是第一個迴圈用來一邊遍曆一邊對比,對比為真時再進入下一個迴圈,這時的空間複雜度為 O(N2)

如果不想嵌套下一個迴圈的,可以使用數組將比較完成的狀態進行儲存。另開一個迴圈,對比遍曆時使用數組中的資料得出結果,這種方法的空間複雜度是O(N)。

解法二

public static boolean isExist2(int[] inputNums){
        if(inputNums.length < 3){
            return false;
        }

        int first = Integer.MAX_VALUE;
        int second = Integer.MAX_VALUE;

        for(int i = 0; i < inputNums.length; i++){
            if(inputNums[i] < first){
                first = inputNums[i];
                continue;
            }

            if(inputNums[i] > first && inputNums[i] < second){
                second = inputNums[i];
                continue;
            }

            if(inputNums[i] > second){
                return true;
            }

        }

        return false;
    }
思路

保留了此前兩個比較狀態在 first 和 second 兩個變數之中,第三個最大數只和第二個儲存變數進行對比即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.