算法练习——力扣随笔【LeetCode】【C++】

2023-07-24 19:26:36 浏览数 (1)

LeetCode 练习随笔

做题环境 C 中等题很值,收获挺多的 不会的题看题解,一道题卡1 h ,多来几道,时间上耗不起。

力扣上的题目和 OJ题目相比不同之处?

一开始上手力扣不习惯,OJ 的题目提交的是完整代码,力扣上的C 只提交目标函数代码,比如某个题目你只需要完成topKFrequent(nums,k)这个函数。

代码语言:javascript复制
class Solution {
    vector<int> topKFrequent(vector<int>& nums, int k) {

    }
};

这也就意味着程序设计的输入不需要自己额外设计了,同时限制了你数据的输入和返回内容的格式。 多亏了oj许多来自力扣的题并补全了完整代码(目标函数部分空缺),渐渐习惯了编写目标函数的答题习惯。

定义问题

在哪定义结构体

有两个位置可写:

1)类里面,讲究的话写在private中,这里就不讲究了。

代码语言:javascript复制
class Solution {
public:
    struct node
    {
      int data;  
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {

    }
};

2)顶部区域

代码语言:javascript复制
 struct node
    {
      int data;  
    };

class Solution {
public:
    struct node
    {
      int data;  
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {

    }
};

在哪定义全局变量

1)顶部区域

代码语言:javascript复制
#include<algorithm>
int a =3;
class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        
        vector<int>v;
        v.push_back(a);
return v;
    }
};

2)换个方式,传参方式改为引用

很多全局变量是可以被替代的,比如希望值被修改并返回到原来作用域,但返回值位置紧张。

暴力时,全局变量开大数组还是有点用处的。

在哪定义头文件

一般是全面的,多虑了。

下面这种做题区域顶部写头文件试过,编译通过。

代码语言:javascript复制
#include<algorithm>

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {

    }
};

排序问题

vector 存入结构体怎么自定义比较规则?

1)自定义规则为结构体形式(优先队列也可用)

代码语言:javascript复制
class Solution
{

public:
    typedef struct node
    {
        int data;
        int sum;
    } ll;
//    static bool cmp(ll a, ll b)
//    {
//        return a.sum > b.sum;
//    }

    struct CompareBySumDesc
    {
        bool operator()( ll a,  ll b) 
        {
           return a.sum > b.sum;
        }
    };


    vector<int> topKFrequent(vector <int> &nums,int k)
    {
       
        vector<ll>v;
        //...
        
		//vector排序
        sort(v.begin(),v.end(),CompareBySumDesc());
//        sort(v.begin(),v.end(),cmp);
        //...
        return res;


    }


};

2)自定义规则为静态函数(简单)

代码语言:javascript复制
class Solution
{

public:
    typedef struct node
    {
        int data;
        int sum;
    } ll;
    static bool cmp(ll a, ll b)
    {
        return a.sum > b.sum;
    }

//    struct CompareBySumDesc
//    {
//        bool operator()(const ll a, const ll b) const
//        {
//           return a.sum > b.sum;
//        }
//    };


    vector<int> topKFrequent(vector <int> &nums,int k)
    {
       
        vector<ll>v;
        //...
        
		//vector排序
//        sort(v.begin(),v.end(),CompareBySumDesc());
        sort(v.begin(),v.end(),cmp);
        //...
        return res;


    }


};

vector 存入结构体怎么逆置?

用 stack。

存入结构体的 priority_queue 怎么自定义比较规则?

给 ll 按照 sum 排序

代码语言:javascript复制
class Solution
{
public:
    typedef struct node
    {
        int data;
        int sum;
    } ll;
  //试过了,static 函数行不通,只能 
    struct cmp
    {
        bool operator()( ll a,  ll b)
        {
            return a.sum > b.sum;
        }
    };
    
    void f()
    {
        priority_queue<ll, vector<ll>, cmp> pq;

      
};
int main()
{
    Solution().f();

    return 0;
}
代码语言:javascript复制
//默认降序

//没有结构体,升序
priority_queue <int,vector<int>,greater<int> > q;

使用 priority_queue 实现堆排序?

优先队列本身是堆实现的。只需维护好优先队列的容量 k,超过pop掉。

统计问题

map 统计的神。遍历别忘了迭代器初始化。

其他

删除 vector 任意位置元素?

代码语言:javascript复制
vector<int>v;
//删除 v[i]
swap( v[i],v[v.size()-1]);
v.pop_back();

其实只是 v.size()减少,内存不释放。

代码语言:javascript复制
 vector<int >v;
    v.push_back(11);
    v.push_back(22);
    v.push_back(33);

    v.pop_back();
    v.pop_back();
    v.pop_back();
    
    cout<<v.size()<<endl;
	v.push_back(44);

    cout<<v[0]<<endl;
    cout<<v[1]<<endl;
    cout<<v[2]<<endl;

这里存入三个元素,之后全部删除,v.size() 结果是 0,是预期的结果, 但此时通过下标访问v[0]~v[2],原来的值仍然可以访问到,删除时内存没有释放掉。 之后再加入新的元素44,v[0] 内容被覆盖了。

vector<vector<int > >v;尖括号嵌套尽可能规范地隔开,

priority_queue <int,vector<int>,greater<int>> pq;这种尖括号紧贴一起依稀记得编译没通过。

连续子序列和问题,优先考虑滑动窗口。

0 人点赞