leetcode运行时结果与我的本地结果不同。我使用动态编程策略和C ++语言来解决这个问题。以下是我的代码:
#include <iostream>
#include <vector>
#include <map>
#include <set>
using namespace std;
void print(vector<vector<bool>>& matrix) {
for(auto row: matrix) {
for(auto item: row) {
cout << item << " ";
}
cout << endl;
}
cout << endl;
}
void eval(vector<int>& nums, map<int, int>& index, vector<vector<bool>>& dp, int i, int j) {
auto i1 = index.find(nums[i] - (j - 1));
if(i1 != index.end())
dp[i][j] = (dp[i][j] || dp[i1->second][j - 1]);
auto i2 = index.find(nums[i] - j);
if(i2 != index.end())
dp[i][j] = (dp[i][j] || dp[i2->second][j]);
auto i3 = index.find(nums[i] - (j + 1));
if(i3 != index.end())
dp[i][j] = (dp[i][j] || dp[i3->second][j + 1]);
}
bool canCross(vector<int>& stones) {
int n = stones.size();
map<int, int> index;
for(int i = 0; i < n; i++)
index[stones[i]] = i;
vector<vector<bool>> dp(n, vector<bool>(n, false));
dp[0][1] = true;
for(int i = 1; i < n; i++) {
for(int j = 1; j < n; j++) {
eval(stones, index, dp, i, j);
}
}
print(dp);
for(int i = 1; i < n; i++)
if(dp[n - 1][i])
return true;
return false;
}
int main() {
int val;
vector<int> nums;
while(cin >> val)
nums.push_back(val);
int res = canCross(nums);
cout << res << endl;
return 0;
}
测试用例:&#34; [0,1,2,3,4,5,6,12]&#34;
当我在本地运行我的代码时,它是正确的,输出:
0 1 0 0 0 0 0 0
0 1 1 0 0 0 0 0
0 1 1 0 0 0 0 0
0 1 1 1 0 0 0 0
0 1 1 1 0 0 0 0
0 1 1 1 0 0 0 0
0 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0
0
我使用c ++ 11,并使用命令编译源代码:
g ++ -std = c ++ 11 -o test 403.cpp
gcc编译器版本信息是:
5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4)
我在本地多次运行我的代码,结果总是如上所述。
但是当我将我的解决方案提交给leetcode oj时。它告诉我&#34;错误的anser&#34;:
Input:
[0,1,2,3,4,5,6,12]
Output:
true
Expected:
false
Stdout:
0 1 0 0 0 0 0 0
0 1 1 0 0 0 0 0
0 1 1 0 0 0 0 0
0 1 1 1 0 0 0 0
0 1 1 1 0 0 0 0
0 1 1 1 0 0 0 0
0 1 1 1 1 0 0 0
0 0 0 0 0 0 0 1
显然,出了点问题。也许我的解决方案不是这个问题的正确解决方案,但为什么leetcode运行时结果与我的本地结果不同?我不是一个经验丰富的编码员,我也不太了解Leetcode OJ机制。我谷歌关于这个并阅读Leetcode FAQ,我还没有得到答案。
如果知道我的问题的人可以解释我的代码发生了什么,请欣赏。