算法题学习笔记(长期更新)

巧妙方法:

1.一个很好的判断是否是回文串的方法(只有要求s里每个子串是否是回文串的时候才用得上)。思路是动态规划。dp[i][j]代表字串s的i到j是否是回文串。

        公式是:如果i>=j:dp[i][j]=true;

                        否则:当(s[i]==s[j])并且dp[i+1][j-1]为真时dp[i][j]为真

vector<vector<int>> f(n,vector<int>(n,true); //默认为真

for(int i=n-1;i>=0;--i){
    for(int j=0;j<n;++j){
        f[i][j]=(s[i]==s[j])&&f[i+1][j-1];
    }
}

//之后f[i][j]就可以查到是否是回文串

数据结构:

1.priority_queue的less是大根堆,greater是小根堆。

2.string的比大小结果:第一个不同那一位,阿紫科码比较大的,大。如果串a是串b的前面一部分,那么b大于a。

降低空间复杂度:

1.将数组中的负数剔除(将它变成一个很大的数),然后将特定位置的元素取负就可以达到标记这个位置的效果,原地哈希。

易出错点:

1.range for的一个缺点:

//下面这种情况nums中的元素其实根本就没有改变,改变的只是临时变量i
for(int i:nums){
    i=-i;
}
//下面的写法才是正确的
for(int i=0;i<nums.size();i++){
    nums[i]=-nums[i];
}
//还有一种办法,把临时量定义成引用
for(int &i:nums){
    i=-i;
}

2.sort函数的第三个参数cmp函数需要写成static。

常用函数记录:

1.pow(a,b) 这是取幂的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值