问题在于LeetCode:
- 增加子序列
醇>给定一个整数数组,你的任务是找到给定数组的所有不同的可能增加的子序列,并且增加的子序列的长度应该至少为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;
}
};