我正在执行leetcode376。摆动子序列。 测试输入[1,7,4,9,2,5]的第一个实例时出错。它显示“线922:字符34:运行时错误:引用绑定到类型为'value_type'(stl_vector.h)的空指针”。谁能告诉我怎么了?非常感谢!
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size() < 2){
return nums.size();
}
std::priority_queue<int> big_heap;
vector<int> flag;
int result;
int length = nums.size();
for(int i = 0; i + 1 < length; i++){
if(nums[i+1] > nums[i]){
flag[i] = 1;
}
else if(nums[i+1] < nums[i]){
flag[i] = -1;
}
else{
flag[i] = 0;
}
}
int count = 1;
for(int i = 0; i + 2 < length;i++){
cout <<flag[i]<<endl;
if(flag[i] + flag[i+1] == 0){
count ++;
}
else{
big_heap.push(count);
count = 1;
}
}
big_heap.push(count);
result = big_heap.top() + 1;
return result;
}
};
答案 0 :(得分:2)
您有未定义的行为,因为您正在访问flag
大小为0
的元素。
如果要写flag[i]
,首先需要在i
中有第flag
个元素。如果事先知道,可以通过将flag
调整为所需的长度来实现。就您而言,似乎您将完全具有length-1
个元素,因此您可以做到
flag.resize(length-1);
或者如果您将声明移至length
之一之后,则可以直接使用std::vector
的构造函数来做到这一点:
std::vector<int> flag(length-1);
或者,您可以使用push_back
在向量的末尾插入元素,如果您只是按顺序编写新的元素(如您在此处所做的那样),例如而不是flag[i] = 1;
:
flag.push_back(1);