leetcode雕虫小技mediu 456. 132 Pattern

题干: https://leetcode.com/problems/132-pattern/

 

这题乍一看要找3个index,从暴力计算法的角度需要O(n^3),这种时间复杂度当然不是最优的。要想办法来降低。

 

例如我们可以先找符合j,k约束的两个位置(暴力法的话时间复杂度为O(n^2)),然后再在j以前的序列中找比k还要小的,但是这种找是不是需要从0到j-1一个个去遍历呢?显然有一个取巧的办法,就是通过一次遍历,我就能知道从0到i下标的段中的最小值,如果我预先把这种下标和段内最小值的映射关系算出来,那么就可以通过O(1)的时间复杂度获取段内最小值,然后就解决了O(1)时间内再某段内找是否存在比k下标位值小的元素。这样就把总时间复杂度降到了O(n^2).

有没有更高效的方法呢?

我们把数组切成左右两端看的话,i处于左段,j,k处于右段。现在左段的最小值已经定了,那么只要在右段中比a[i]大的所有值中找到一个降序的case,即可确定为存在132模式。这样的时间复杂度比O(n^2)的暴力遍历要高效,因为不用暴力比较了,但是最坏情况应该仍然是O(n^2)。anyway,做到这一步足以通过OJ了,代码如下:

package com.example.demo.leetcode;

import java.util.HashMap;
import java.util.Map;

public class One132Pattern {
    public boolean find132pattern(int[] nums) {

        if(nums.length<3){
            return false;
        }

        Map minMap = new HashMap<>();

        int min = Integer.MAX_VALUE;
        for(int i=0;ival){
                current = nums[i];
                if(current

 

反思:做题最好从暴力解法入手,然后尝试优化方案,逐步降低,这样思路会比较顺畅。

你可能感兴趣的:(leetcode,算法,刷题)