这个问题与我解决的here类似,尽管该算法适用于示例案例,但仍给了我一个错误的答案。这次我已初始化所有变量,并且适用于的修改版本我以前的算法。
#include <iostream>
int main() {
int n;
std::cin >> n;
int arr[n];
for (int i = 0; i <n ;++i) {
std::cin >> arr[i];
}
int four_count = 0, two_count = 0, three_long=0, one_long = 0 , max1_long = 0 ,max3_long = 0,a_depth = 0,max_depth = 0;
for (int i = 0; i < n; ++i) {
if (arr[i] == 3) {
if (arr[i+1] == 1) {
++a_depth;
if (a_depth > max_depth) {
max_depth = a_depth;
}
}
++four_count;
three_long += 2;
}
if (arr[i] == 1) {
if (arr[i+1] == 3) {
++a_depth;
if (a_depth > max_depth) {
max_depth = a_depth;
}
}
++two_count;
one_long += 2 ;
}
if (arr[i] == 2) {
if (arr[i+1] == 4 && i < n-1) {
--a_depth;
}
--two_count;
}
if (arr[i] == 4) {
if (arr[i+1] == 2 && i < n-1){
--a_depth;
}
--four_count;
}
if (four_count == 0 && two_count == 0) {
if (three_long >= one_long) {
if (three_long > max3_long) {
max3_long = three_long+one_long;
}
three_long = 0;
one_long = 0;
}
else {
if (one_long > max1_long) {
max1_long = one_long+three_long;
}
one_long = 0;
three_long = 0;
}
}
}
std::cout << max_depth*2 << " " << max1_long << " " << max3_long;
std::cout << "\n";
return 0;
}
这里是问题的链接:
答案 0 :(得分:2)
在下面的代码中:
for (int i = 0; i < n; ++i) {
if (arr[i] == 3) {
if (arr[i+1] == 1) {
当i
到达n-1
时,arr[i+1]
变成arr[n]
,导致超出范围的内存访问,这将导致不确定的行为。
答案 1 :(得分:1)
假设n
等于5
。这意味着数组arr
的索引最大为4
,因为第一个为0
。
在您的循环中
for (int i = 0; i < n; ++i)
{ if (arr[i] == 3) {
if (arr[i+1] == 1) {
在某个时候i
变成n-1
,所以i == 4
,然后尝试arr[i+1]
的意思是arr[5]
,这超出了范围。
请注意,在P.Ws帖子的评论中,您尝试了if (arr[i+1] == 1 && i < n-1)
来解决此问题。那将行不通,因为仍然有一个arr[i+1]
正在执行。您可以使用
if(i < n-1) {
if(arr[i+1]) {
但这将意味着ifs的嵌套更深。您可能应该重新考虑解决给定问题的方法。
编辑:确定是++i
而不是i++
吗?