LeetCode 第391场周赛个人题解

目录

哈沙德数

原题链接

思路分析

AC代码

[换水问题 II](#换水问题 II)

原题链接

思路分析

AC代码

交替子数组计数

原题链接

思路分析

AC代码

最小化曼哈顿距离

原题链接

思路分析

AC代码


哈沙德数

原题链接

思路分析

签到题,不说了

AC代码

cpp 复制代码
class Solution:
    def sumOfTheDigitsOfHarshadNumber(self, x: int) -> int:
        k = sum(int(x) for x in str(x))
        return k if x % k == 0 else -1

换水问题 II

原题链接

换水问题 II - 力扣 (LeetCode) 竞赛

思路分析

赛场为了速度直接模拟,应该可以推公式的,也不说了

AC代码

cpp 复制代码
class Solution {
public:
    int maxBottlesDrunk(int a, int b) {
        int ret = a, cur = a;
        while(cur >= b){
            ret ++, cur = cur - b + 1, b++;
        }
        return ret;
    }
};

交替子数组计数

原题链接

交替子数组计数 - 力扣 (LeetCode) 竞赛

思路分析

对于一个长度为n的交替数组,可以拆分成n个长度为1的交替子数组,n-1个长度为2的交替子数组...一个长度为n的交替子数组

那么对于一个连续的交替子数组而言其贡献就i是(n + 1) * n / 2

那么我们可以一次遍历中找到所有的连续的交替子数组累加其贡献即可

时间复杂度:O(n)

AC代码

cpp 复制代码
class Solution {
public:
    long long countAlternatingSubarrays(vector<int>& nums) {
        int pre = -1;
        long long ret = 0, cur = 0;
        for(auto x : nums){
            if(x != pre){
                cur ++;
            }
            else{
                ret += (cur + 1) * cur / 2;
                cur = 1;
            }
            pre = x;
        }
        ret += (cur + 1) * cur / 2;
        return ret;
    }
};

最小化曼哈顿距离

原题链接

最小化曼哈顿距离 - 力扣 (LeetCode) 竞赛

思路分析

对于坐标(a, b),(c, d)

其曼哈顿距离为|a - c| + |b - d|,我们不妨设a > c, b > c

那么曼哈顿距离:a + b - (b + d) = a + b - b - d

我们发现第二个坐标各个维度的系数一定跟第一个坐标各个维度的系数相反

则我们不妨设第一个坐标的系数为(t1, t2),第二个为(-t1, -t2)

对任意两个n维度坐标(a1......an), (b1......bn)求曼哈顿距离:

我们发现我们只需要枚举向量(t1......tn)即可,即2^n种取值,每种向量下每个坐标都可以变换出一个值,该向量下的最大曼哈顿距离就是最大值减去最小值

对于本题而言,向量维度为2,则我们只需要枚举4次,每次遍历一遍点对

这样求出了最大值,而题目要的是删除一个坐标后最大值的最小值,显然要删除的就是最大值对应的两个坐标中的一个

我们维护最大值的时候记录此时用到的两个点对,然后枚举删除任意一个后的最大值,取最小的那个即可

时间复杂度O(n)

AC代码

cpp 复制代码
class Solution {
public:
    
    int minimumDistance(vector<vector<int>>& points) {
        int n = points.size(), ret = 1e9, s = 0;
        unordered_set<int> id;
        for(int i = 0, ed = (1 << 2); i < ed; i++){
            int ma = -1e9, mi = 1e9, mai, mii;
            for(int j = 0, s; j < n; j++){
                int sum = 0;
                for(int k = 0; k < 2; k++)
                    if(i >> k & 1) sum -= points[j][k];
                    else sum += points[j][k];
                if(sum > ma) ma = sum, mai = j;
                if(sum < mi) mi = sum, mii = j;
            }
            if(ma - mi > s) s = ma - mi, id.clear(), id.insert(mai), id.insert(mii);
            else if(ma - mi == s) id.insert(mai), id.insert(mii);
        }
        for(auto x : id){
            s = 0;
            for(int i = 0, ed = (1 << 2); i < ed; i++){
            int ma = -1e9, mi = 1e9;
            for(int j = 0, s; j < n; j++){
                if(j == x) continue;
                int sum = 0;
                for(int k = 0; k < 2; k++){
                    if(i >> k & 1) sum -= points[j][k];
                    else sum += points[j][k];}
                if(sum > ma) ma = sum;
                if(sum < mi) mi = sum;
            }
            if(ma - mi > s) s = ma - mi;
            }
            ret = min(ret , s);
        }
        return ret;
    }
};
相关推荐
纪元A梦3 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
阿让啊4 小时前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
深圳市快瞳科技有限公司4 小时前
小场景大市场:猫狗识别算法在宠物智能设备中的应用
算法·计算机视觉·宠物
liulilittle4 小时前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
superlls7 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
田里的水稻7 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
纪元A梦7 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
Ripple123128 小时前
数据结构:顺序表与链表
数据结构·链表
Jayden_Ruan8 小时前
C++逆向输出一个字符串(三)
开发语言·c++·算法
一个响当当的名号9 小时前
B树,B+树,B*树(无代码)
数据结构·b树