为什么LeetCode的Golang代码增加后续TLE?

时间:2018-03-22 11:28:41

标签: c++ algorithm go

问题在于LeetCode:

  
      
  1. 增加子序列
  2.         

    给定一个整数数组,你的任务是找到给定数组的所有不同的可能增加的子序列,并且增加的子序列的长度应该至少为2.

         

    示例:

         

    输入:[4,6,7,7]

         

    输出:[[4,6],[4,7],[4,6,7],[4,6,7,7],[6,7],[6,7,7], [7,7],[4,7,7]]

我分别在C ++和Golang中编写了相同的算法。

Golang版本在案例[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]上不断获得TLE。但C ++版本运行良好,击败了72%的cpp解决方案。

我很难找到Golang版本的错误,所以我非常感谢你的帮助。

以下是我的代码:

Golang:

func findSubsequences(nums []int) [][]int {

    n := len(nums)
    m := make(map[int]int)
    cur := make([][]int, 1)
    cur[0] = []int{}

    var ans [][]int
    for i := 0; i < n; i++ {
        lim := len(cur)

        st, ok := m[nums[i]]
        if !ok {
            st = 0
        }

        m[nums[i]] = lim

        for j := st; j < lim; j++ {
            if len(cur[j]) > 0 && nums[i] < cur[j][len(cur[j])-1] {
                continue
            }

            tmp := append(cur[j], nums[i])
            cur = append(cur, tmp)

            if len(tmp) >= 2 {
                ans = append(ans, tmp)
            }
        }
    }

    return ans
}

C ++:

class Solution {
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        vector<vector<int>> ans, cur;
        cur.push_back(vector<int>());

        unordered_map<int, int> m;

        int n = nums.size(), st;
        for (int i = 0; i < n; ++i) {
            if (m.count(nums[i]))
                st = m[nums[i]];
            else 
                st = 0;

            int lim = cur.size();
            m[nums[i]] = lim;
            for (int j = st; j < lim; j++) {
                if (cur[j].size() > 0 && nums[i] < cur[j].back())
                    continue;

                cur.push_back(cur[j]);
                cur.back().push_back(nums[i]);

                if (cur.back().size() >= 2)
                    ans.push_back(cur.back());
            }
        }

        return ans;
    }
};

0 个答案:

没有答案