和有限的最长子序列(用栈)-LeetCode

 题目是这样的, 和有限的最长子序列,是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²)

看了这道题的大神们的回答,我还没学到那么多知识,看不太懂,后续可能会重新做这道题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值