题目是这样的, 和有限的最长子序列,是leetcode上的一道简单题。
因为我是在栈的标签中发现的,所以这里用顺序栈实现,但无奈时间复杂度太高了(O(n²)),最终没有被测试结束。
期间遇到了一些问题,比如没接触过的<vector>集合的使用(用for的遍历输出,sort(argv.again(),argv.end())的升序处理,argv.push_back(var)在最后一个位置压入数据)和C++无法返回数组,只能返回数组首地址(我是小趴菜);
还有一个问题,就是一定要先升序排列,不然程序会出问题,是这样的,因为每次都是从加数集合的第一个元素遍历,假如 和 的结合的第一个元素是10,而加数集合的元素是[7,4,3,1],不排序加数的个数就是2(7和3),而升序后[1,3,4,7],加数的个数就是3[1,3,4],所以一定要先排序,这也是我这次遇到的最大的问题了(不考虑时间复杂度)。
下面上代码:
struct Stack{//定义一个顺序栈
int data[100];
int index;//栈顶指针
}S1;
class Solution {
public:
vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {
int temp=0;//用来记录栈内元素相加的总和
int i=0;//遍历结果集合
int n = nums.size();
int m = queries.size();
vector<int> retArray;//返回符合条件的个数的集合
S1.index = 0;//初始化栈
sort(nums.begin(),nums.end());//对加数进行从小到大排序
while(i<m){//遍历结果
for(int j=0;j<n;j++){//遍历加数
if(nums[j]<queries[i]){//加数比结果小,满足第一层条件
if(S1.index==0){//栈顶为空,直接入栈
S1.data[S1.index] = nums[j];
temp+=S1.data[S1.index];//保存栈内元素的和
cout<<"S1.index为0时: temp为: "<<temp<<endl;
S1.index++;//栈顶指针后移
}
else{
if(temp+nums[j]==queries[i]){//如果栈内元素的总和+下一加数刚好等于结果,就直接退出本次加数循环,提高代码运行效率
S1.data[S1.index]=nums[j];
S1.index++;//栈顶指针后移
cout<<"Index: "<<S1.index<<endl;
break;
}
else if(temp+nums[j]<queries[i]){
S1.data[S1.index]=nums[j];
S1.index++;//栈顶指针后移
temp+=nums[j];//如果栈内元素的总和+下一个加数仍小于结果,则把栈内元素的总和+下一个加数赋值给temp
}
}
cout<<"S1.Index: "<<S1.index<<" que: "<<queries[i]<<" temp: "<<temp<<" "<<endl;
}
}
cout<<"ret的index:"<<S1.index<<endl;
retArray.push_back(S1.index);//栈顶指针位置就是符合条件的加数的个数,压入retArray集合
S1.index=0;//将栈清空(逻辑上)
temp=0;//将栈内元素的总和置为0
i++;
//准备下一次判断
}
return retArray;
}
};
//总体思想:
//将加数集合升序排序
//判断加数是否满足条件,是则入栈,不是,则判断下一个加数
//最后栈的大小就是满足条件的加数的个数,压到集合里
//时间复杂度过高O(n²)
看了这道题的大神们的回答,我还没学到那么多知识,看不太懂,后续可能会重新做这道题。