LeetCode 第113 双周赛补题

使数组成为递增数组的最少右移次数3

class Solution {
public:
    int minimumRightShifts(vector<int>& nums) {
        int n = nums.size();
        int j = -1;
        for (int i = 0;i < nums.size()-1;i ++) {
            if (nums[i+1] < nums[i]) {
                j = i+1;break;
            }
        }
        int k = j+1;
        if (j == -1) return 0;
        for (int i = j;i < n;i ++) {
            if (nums[(i+1)%n] < nums[i%n]) return -1;
        }
        return n-j;
    }
};

删除数对后的最小数组长度4

  • 题意
    在这里插入图片描述
  • 思路
    好 CF。。。
    在这里插入图片描述
  • 代码
class Solution {
public:
    int minLengthAfterRemovals(vector<int> &nums) {
        int n = nums.size();
        int x = nums[n / 2];
        int max_cnt = upper_bound(nums.begin(), nums.end(), x) -
                      lower_bound(nums.begin(), nums.end(), x);
        return max(max_cnt * 2 - n, n % 2);
    }
};

统计距离为 k 的点对5

  • 题意
    在这里插入图片描述
  • 思路
    在这里插入图片描述
  • 代码
class Solution {
public:
    int countPairs(vector<vector<int>> &coordinates, int k) {
        int ans = 0;
        unordered_map<long long, int> cnt;
        for (auto &p: coordinates) {
            for (int i = 0; i <= k; i++) {
                // 直接 ans += cnt[...] 会插入不存在的点
                auto it = cnt.find((p[0] ^ i) * 2000000LL + (p[1] ^ (k - i)));
                if (it != cnt.end()) {
                    ans += it->second;
                }
            }
            cnt[p[0] * 2000000LL + p[1]]++;
        }
        return ans;
    }
};

可以到达每一个节点的最少边反转次数

  • 题意
    在这里插入图片描述
  • 思路
    换根DP待补
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

疯狂的码泰君

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

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

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

打赏作者

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

抵扣说明:

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

余额充值