力扣第81场双周赛

LeetCode 2395. 和相等的子数组:

题目链接:

2395. 和相等的子数组 - 力扣(LeetCode)

解题思路:

把所有相邻两个数相加将他们的和存入一个数组进行排序,然后判断相邻的值是否相等即可:

const int N = 1000 * 1000 + 10;
class Solution {
public:
    bool findSubarrays(vector<int>& nums) {
        int n = nums.size();
        
        int cnt = 0;
        int ans[N] = {0};
        for (int i = 0; i + 1< n; i ++ ) ans[cnt ++ ] = nums[i] + nums[i + 1];
        
        sort(ans, ans + cnt);
        for (int i = 0; i + 1 < cnt; i ++ )
            if (ans[i] == ans[i + 1]) return true;
        
        return false;
    }
};

LeetCode 2396. 严格回文的数字

题目链接:

2396. 严格回文的数字 - 力扣(LeetCode)

解题思路:

将n转化为 2 到 n - 1进制数,然后对于每次转化为的进制数直接判断它是否回文即可:

const int N = 1000 * 1000 + 10;
class Solution {
public:
    bool findSubarrays(vector<int>& nums) {
        int n = nums.size();
        
        int cnt = 0;
        int ans[N] = {0};
        for (int i = 0; i + 1< n; i ++ ) ans[cnt ++ ] = nums[i] + nums[i + 1];
        
        sort(ans, ans + cnt);
        for (int i = 0; i + 1 < cnt; i ++ )
            if (ans[i] == ans[i + 1]) return true;
        
        return false;
    }
};

LeetCode 2397. 被列覆盖的最多行数

题目链接:

2397. 被列覆盖的最多行数 - 力扣(LeetCode)

解题思路:

将列数转化为m位的二进制数,若第i位为1说明选择这个列,否则不选择这列:

然后枚举所有行判断改行的所有1是否在选择的列上

const int N = 15;
bool st[N];
int ans;
class Solution {
public:
    int maximumRows(vector<vector<int>>& matrix, int cols) {
        int n = matrix.size(), m = matrix[0].size();

        int res = 0;
        for (int i = 0; i < (1 << m); i ++ )//枚举所有选择的列的状态
        {
            int cnt = 0;
            for (int j = 0; j < m; j ++ )
                if (i >> j & 1) cnt ++ ;//若第j位为1说明选择第j列
            
            if (cols != cnt) continue;//判断所选择的列数是否和题目规定的一样

            int tot = 0;//选择上述枚举的列所满足条件的行数
            for (int j = 0; j < n; j ++ )
            {
                bool flag = true;
                for (int k = 0; k < m; k ++ )
                    if (matrix[j][k] && !(i >> k & 1))//若第j行第k列为1但没选择这一列说明该行
                                                      //不符合条件
                    {
                        flag = false;
                        break;
                    }

                if (flag) tot ++ ;//若满足要求行数加1
            }

            res = max(tot, res);//记录最大值
        }

        return res;
    }
};

LeetCode 2398. 预算内的最多机器人数目

题目链接:

2398. 预算内的最多机器人数目 - 力扣(LeetCode)

双指针算法:一个前指针 j 以及一个后指针 i 每次判断区间[j, i]的机器人是否满足要求,若不满足,则j ++ 。

这里需要一个单调队列用于存储从区间[i, j]的max(chargeTimes)

整个算法计算的是以下标 i 为结尾的可选机器人最多的数目

typedef long long LL;

class Solution {
public:
    int maximumRobots(vector<int>& x, vector<int>& y, long long m) {
        int n = x.size();
        LL sum = 0;
        int res = 0;
        deque<int> q;//单调队列
        for (int i = 0, j = 0; i < n; i ++ )
        {
            sum += y[i];
            while (q.size() && x[q.back()] <= x[i]) q.pop_back();//保证队列单调递减,即对头为
            q.push_back(i);                                      //最大值
            while (q.size() && sum * (i - j + 1) + x[q.front()] > m)//若区间[i,j]中的费用大于预付
            {
                sum -= y[j];//则j ++ ;
                if (q.front() == j) q.pop_front();//若对头等于j的抛出对头
                j ++ ;
            }

            res = max(res, i - j + 1);//记录最大值
        }

        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥也不会hh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值