算法日常刷题笔记(6)

news2025/4/21 17:50:45

重整旗鼓 第六篇笔记

第一天

使字符串平衡的最小交换次数

给你一个字符串 s ,下标从 0 开始 ,且长度为偶数 n 。字符串 恰好 由 n / 2 个开括号 '[' 和 n / 2 个闭括号 ']' 组成。

只有能满足下述所有条件的字符串才能称为 平衡字符串 :

  • 字符串是一个空字符串,或者
  • 字符串可以记作 AB ,其中 A 和 B 都是 平衡字符串 ,或者
  • 字符串可以写成 [C] ,其中 C 是一个 平衡字符串 。

你可以交换 任意 两个下标所对应的括号 任意 次数。

返回使 s 变成 平衡字符串 所需要的 最小 交换次数

int minSwaps(char* s) {
    int balance = 0;
    int maxUnbalanced = 0;

    for (int i = 0; s[i] != '\0'; i++) {
        if (s[i] == '[') {
            balance++;
        } else {
            balance--;
        }
        if (balance < maxUnbalanced) {
            maxUnbalanced = balance;
        }
    }

    return (1 - maxUnbalanced) / 2;
}

超级饮料的最大强化能量

超级饮料的最大强化能量https://leetcode.cn/problems/maximum-energy-boost-from-two-drinks/

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB,数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。

你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而,如果从一种能量饮料切换到另一种,你需要等待一小时来梳理身体的能量体系(在那个小时里你将不会获得任何强化能量)。

返回在接下来的 n 小时内你能获得的 最大 总强化能量。

注意 你可以选择从饮用任意一种能量饮料开始。

long long max(long long a,long long b){
    return a > b ? a : b;
}

long long maxEnergyBoost(int* energyDrinkA, int energyDrinkASize, int* energyDrinkB, int energyDrinkBSize) {
    
    int n = energyDrinkASize;
    long long dp[n][2];

    dp[0][0] = energyDrinkA[0];
    dp[0][1] = energyDrinkB[0];

    dp[1][0] = dp[0][0] + energyDrinkA[1];
    dp[1][1] = dp[0][1] + energyDrinkB[1];

    for(int i = 2;i < n;i ++){

        dp[i][0] = max(dp[i - 1][0] + energyDrinkA[i],dp[i - 2][1] + energyDrinkA[i]);
        dp[i][1] = max(dp[i - 1][1] + energyDrinkB[i],dp[i - 2][0] + energyDrinkB[i]); 

    }

    return max(dp[n - 1][0],dp[n - 1][1]);

}

使两个整数相等的位更改次数

使两个整数相等的位更改次数https://leetcode.cn/problems/number-of-bit-changes-to-make-two-integers-equal/

给你两个正整数 n 和 k

你可以选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0。

返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。

#include <stdio.h>

int minChanges(int n, int k) {
    // 如果 n 小于 k,无法通过将 n 的 1 变为 0 得到 k
    if (n < k) {
        return -1;
    }
    int ans = 0;
    // 遍历 32 位整数的每一位
    for (int i = 0; i < 32; i++) {
        int bitN = (n >> i) & 1;
        int bitK = (k >> i) & 1;
        // 如果 n 的当前位为 1 而 k 的当前位为 0,需要进行一次更改
        if (bitN == 1 && bitK == 0) {
            ans++;
        }
        // 如果 k 的当前位为 1 而 n 的当前位为 0,无法实现,返回 -1
        if (bitN == 0 && bitK == 1) {
            return -1;
        }
    }
    return ans;
}    

第二天

对角线上的质数

对角线上的质数https://leetcode.cn/problems/prime-in-diagonal/

给你一个下标从 0 开始的二维整数数组 nums 。

返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数,返回 0 。

注意:

  • 如果某个整数大于 1 ,且不存在除 1 和自身之外的正整数因子,则认为该整数是一个质数。
  • 如果存在整数 i ,使得 nums[i][i] = val 或者 nums[i][nums.length - i - 1]= val ,则认为整数 val 位于 nums 的一条对角线上。

在上图中,一条对角线是 [1,5,9] ,而另一条对角线是 [3,5,7] 。

bool fun(int n){

    if(n <= 1){
        return false;
    }

    for(int i = 2;i <= sqrt(n);i++){
        if(n % i == 0){
            return false;
        }
    }
    return true;

}

int diagonalPrime(int** nums, int numsSize, int* numsColSize) {
    
    int ans = 0;

    for(int i = 0;i < numsSize;i++){
        if(fun(nums[i][i]) && nums[i][i] > ans){
            ans = nums[i][i];
        }
        if(fun(nums[i][numsSize - 1 - i]) && nums[i][numsSize - 1 - i] > ans){
            ans = nums[i][numsSize - 1 - i];
        }
    }

    return ans;

}

数组大小减半

数组大小减半https://leetcode.cn/problems/reduce-array-size-to-the-half/

给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。

返回 至少 能删除数组中的一半整数的整数集合的最小大小。

#include <vector>
#include <unordered_map>
#include <algorithm>

class Solution {
public:
    int minSetSize(std::vector<int>& arr) {
        std::unordered_map<int, int> map;
        // 统计每个元素的出现次数
        for (int num : arr) {
            map[num]++;
        }

        std::vector<int> frequencies;
        // 将出现次数存入 vector
        for (const auto& pair : map) {
            frequencies.push_back(pair.second);
        }

        // 按出现次数从大到小排序
        std::sort(frequencies.begin(), frequencies.end(), std::greater<int>());

        int total = 0;
        int count = 0;
        // 计算最小集合大小
        for (int freq : frequencies) {
            total += freq;
            count++;
            if (total >= arr.size() / 2) {
                break;
            }
        }

        return count;
    }
};

分割数组的方案数

分割数组的方案数https://leetcode.cn/problems/number-of-ways-to-split-array/

给你一个下标从 0 开始长度为 n 的整数数组 nums 。
如果以下描述为真,那么 nums 在下标 i 处有一个 合法的分割 :

  • 前 i + 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。
  • 下标 i 的右边 至少有一个 元素,也就是说下标 i 满足 0 <= i < n - 1 。

请你返回 nums 中的 合法分割 方案数。

 暴力破解

// using namespace std;

class Solution {
public:
    int waysToSplitArray(vector<int>& nums) {
        
        std::vector<long long>sum(nums.size());
        int ans = 0;

        sum[0] = nums[0]; // 包括这个数在内的前缀和
        for(int i = 1; i < nums.size();i++){
            sum[i] = sum[i - 1] + nums[i];
        }

        for(int i = 0; i < nums.size() - 1;i++){
            if(sum[i] >= (sum[nums.size() - 1] - sum[i])){
                ans ++;
            }
        }

        return ans;
    }
};

优化解答

class Solution {
public:
    int waysToSplitArray(vector<int>& nums) 
    {
        long long total = reduce(nums.begin(), nums.end(), 0LL);
        int ans = 0;
        long long s = 0;
        for (int i = 0; i + 1 < nums.size(); i++) {
            s += nums[i];
            if (s * 2 >= total) {
                ans++;
            }
        }
        return ans;

    }
};

第三天

转换二维数组

转换二维数组https://leetcode.cn/problems/convert-an-array-into-a-2d-array-with-conditions/

给你一个整数数组 nums 。请你创建一个满足以下条件的二维数组:

  • 二维数组应该  包含数组 nums 中的元素。
  • 二维数组中的每一行都包含 不同 的整数。
  • 二维数组的行数应尽可能  。

返回结果数组。如果存在多种答案,则返回其中任何一种。

请注意,二维数组的每一行上可以存在不同数量的元素

int** findMatrix(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
    // 用于统计每个数字出现的次数,由于数字范围是 1 到 200,所以数组大小为 201
    int num[201];
    memset(num, 0, sizeof(int) * 201);
    int max = 0;

    // 统计每个数字出现的次数,并找出最大出现次数
    for (int i = 0; i < numsSize; i++) {
        num[nums[i]]++;
        if (num[nums[i]] > max) {
            max = num[nums[i]];
        }
    }

    // 最大出现次数即为二维数组的行数
    *returnSize = max;
    // 为列大小数组分配内存
    *returnColumnSizes = (int*)malloc(max * sizeof(int));
    // 为二维数组分配内存
    int** result = (int**)malloc(max * sizeof(int*));

    // 初始化每一行的列大小为 0
    for (int i = 0; i < max; i++) {
        (*returnColumnSizes)[i] = 0;
        result[i] = NULL;
    }

    // 遍历每个数字及其出现次数,将数字按顺序填充到二维数组中
    for (int i = 1; i <= 200; i++) {
        for (int j = 0; j < num[i]; j++) {
            if (result[j] == NULL) {
                result[j] = (int*)malloc(sizeof(int));
            } else {
                result[j] = (int*)realloc(result[j], ((*returnColumnSizes)[j] + 1) * sizeof(int));
            }
            result[j][(*returnColumnSizes)[j]] = i;
            (*returnColumnSizes)[j]++;
        }
    }

    return result;
} 

超过阈值的最少操作数

超过阈值的最少操作数 Ihttps://leetcode.cn/problems/minimum-operations-to-exceed-threshold-value-i/

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。

一次操作中,你可以删除 nums 中的最小元素。

你需要使数组中的所有元素都大于或等于 k ,请你返回需要的 最少 操作次数。

int comp(const void* a,const void* b){
    return (*(int*)a - *(int*)b);
}

int minOperations(int* nums, int numsSize, int k) {

    if(numsSize == 1){
        return numsSize - 1;
    }
    
    qsort(nums,numsSize,sizeof(int),comp);

    int ans = 0;
    for(int i = 0;i < numsSize;i ++){
        if(nums[i] < k){ans ++;}
        else{return ans;}
    }

    return ans;
}

统计不是特殊数字的数字数

统计不是特殊数字的数字数量https://leetcode.cn/problems/find-the-count-of-numbers-which-are-not-special/

给你两个 正整数 l 和 r。对于任何数字 xx 的所有正因数(除了 x 本身)被称为 x 的 真因数

如果一个数字恰好仅有两个 真因数,则称该数字为 特殊数字。例如:

  • 数字 4 是 特殊数字,因为它的真因数为 1 和 2。
  • 数字 6 不是 特殊数字,因为它的真因数为 1、2 和 3。

返回区间 [l, r] 内 不是 特殊数字 的数字数量。

暴力破解(未通过) 

bool fun(int x){

    int num = 0;
    for(int i = 1;i < x/2 + 1;i++){
        if(x % i == 0){
            num ++;
            if(num > 2){
                return false;
            }
        }
    }

    if(num == 2){return true;}
    else{return false;}
}

int nonSpecialCount(int l, int r) {
    
    int length = r - l + 1;
    int ans = 0;
    for(int i = l;i <= r;i ++){
        if(fun(i)){
            ans ++;
        }
    }
    return length - ans;
}

 优化解

int nonSpecialCount(int l, int r) {
    int n = (int)sqrt(r);
    int v[n + 1];
    int res = r - l + 1;
    for (int i = 0; i <= n; i++) {
        v[i] = 0;
    }
    for (int i = 2; i <= n; i++) {
        if (v[i] == 0) {
            if (i * i >= l && i * i <= r) {
                res--;
            }
            for (int j = i * 2; j <= n; j += i) {
                v[j] = 1;
            }
        }
    }
    return res;
}

第四天

适龄的朋友

适龄的朋友https://leetcode.cn/problems/friends-of-appropriate-ages/

在社交媒体网站上有 n 个用户。给你一个整数数组 ages ,其中 ages[i] 是第 i 个用户的年龄。

如果下述任意一个条件为真,那么用户 x 将不会向用户 yx != y)发送好友请求:

  • ages[y] <= 0.5 * ages[x] + 7
  • ages[y] > ages[x]
  • ages[y] > 100 && ages[x] < 100

否则,x 将会向 y 发送一条好友请求。

注意,如果 x 向 y 发送一条好友请求,y 不必也向 x 发送一条好友请求。另外,用户不会向自己发送好友请求。

返回在该社交媒体网站上产生的好友请求总数。

#include <stdio.h>

int numFriendRequests(int* ages, int agesSize) {
    int ageCount[121] = {0};
    // 统计每个年龄的人数
    for (int i = 0; i < agesSize; i++) {
        ageCount[ages[i]]++;
    }

    int ans = 0;
    // 遍历所有可能的年龄对
    for (int i = 1; i <= 120; i++) {
        for (int j = 1; j <= 120; j++) {
            if (j > 0.5 * i + 7 && j <= i) {
                if (i == j) {
                    // 同一年龄的人互相发好友请求
                    ans += ageCount[i] * (ageCount[i] - 1);
                } else {
                    // 不同年龄的人发好友请求
                    ans += ageCount[i] * ageCount[j];
                }
            }
        }
    }
    return ans;
}

求出硬币游戏的赢家

求出硬币游戏的赢家https://leetcode.cn/problems/find-the-winning-player-in-coin-game/

给你两个  整数 x 和 y ,分别表示价值为 75 和 10 的硬币的数目。

Alice 和 Bob 正在玩一个游戏。每一轮中,Alice 先进行操作,Bob 后操作。每次操作中,玩家需要拿走价值 总和 为 115 的硬币。如果一名玩家无法执行此操作,那么这名玩家 输掉 游戏。

两名玩家都采取 最优 策略,请你返回游戏的赢家。

char* winningPlayer(int x, int y) {
    
    int nums = 0;
    while(1){
        if(x >= 1 && y >= 4){
            nums ++;
            x -= 1;
            y -= 4;
        }else{
            break;
        }
    }

    char* ans;
    if(nums % 2 == 1){
      ans = "Alice";
    }else{
      ans = "Bob";
    }

    return ans;
}

形成目标字符串需要的最少字符串数

形成目标字符串需要的最少字符串数 Ihttps://leetcode.cn/problems/minimum-number-of-valid-strings-to-form-target-i/

给你一个字符串数组 words 和一个字符串 target

如果字符串 x 是 words 中 任意 字符串的 前缀,则认为 x 是一个 有效 字符串。

现计划通过 连接 有效字符串形成 target ,请你计算并返回需要连接的 最少 字符串数量。如果无法通过这种方式形成 target,则返回 -1

class Solution {
public:
    int minValidStrings(vector<string>& words, string target) {
        auto prefix_function = [](const string& word, const string& target) -> vector<int> {
            string s = word + '#' + target;
            int n = s.size();
            vector<int> pi(n, 0);
            for (int i = 1; i < n; i++) {
                int j = pi[i - 1];
                while (j > 0 && s[i] != s[j]) {
                    j = pi[j - 1];
                }
                if (s[i] == s[j]) {
                    j++;
                }
                pi[i] = j;
            }
            return pi;
        };

        int n = target.size();
        vector<int> back(n, 0);
        for (const string& word : words) {
            vector<int> pi = prefix_function(word, target);
            int m = word.size();
            for (int i = 0; i < n; i++) {
                back[i] = max(back[i], pi[m + 1 + i]);
            }
        }

        vector<int> dp(n + 1, 0);
        for (int i = 1; i <= n; i++) {
            dp[i] = 1e9;
        }
        for (int i = 0; i < n; i++) {
            dp[i + 1] = dp[i + 1 - back[i]] + 1;
            if (dp[i + 1] > n) {
                return -1;
            }
        }
        return dp[n];
    }
};

第五天

最大或值

最大或值https://leetcode.cn/problems/maximum-or/

给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k 。每一次操作中,你可以选择一个数并将它乘 2 。

你最多可以进行 k 次操作,请你返回 nums[0] | nums[1] | ... | nums[n - 1] 的最大值。

a | b 表示两个整数 a 和 b 的 按位或 运算。

long long maximumOr(int* nums, int numsSize, int k) {
    long long *suf = (long long *)malloc((numsSize + 1) * sizeof(long long));
    suf[numsSize] = 0;

    for (int i = numsSize - 1; i >= 0; i--) {
        suf[i] = suf[i + 1] | nums[i];
    }

    long long res = 0;
    long long pre = 0;
    for (int i = 0; i < numsSize; i++) {
        res = fmax(res, pre | ((long long)nums[i] << k) | suf[i + 1]);
        pre |= nums[i];
    }
    free(suf);
    return res;
}

矩阵中的蛇

矩阵中的蛇https://leetcode.cn/problems/snake-in-matrix/

大小为 n x n 的矩阵 grid 中有一条蛇。蛇可以朝 四个可能的方向 移动。矩阵中的每个单元格都使用位置进行标识: grid[i][j] = (i * n) + j

蛇从单元格 0 开始,并遵循一系列命令移动。

给你一个整数 n 表示 grid 的大小,另给你一个字符串数组 commands,其中包括 "UP""RIGHT""DOWN" 和 "LEFT"。题目测评数据保证蛇在整个移动过程中将始终位于 grid 边界内。

返回执行 commands 后蛇所停留的最终单元格的位置。

int finalPositionOfSnake(int n, char** commands, int commandsSize) {
    int ans = 0;
    for (int i = 0; i < commandsSize; i++) {
        if (commands[i][0] == 'U') {
            ans -= n;
        } else if (commands[i][0] == 'D') {
            ans += n;
        } else if (commands[i][0] == 'L') {
            ans--;
        } else {
            ans++;
        }
    }
    return ans;
}

检查棋盘方格颜色是否相同

检查棋盘方格颜色是否相同https://leetcode.cn/problems/check-if-two-chessboard-squares-have-the-same-color/

给你两个字符串 coordinate1 和 coordinate2,代表 8 x 8 国际象棋棋盘上的两个方格的坐标。

以下是棋盘的参考图。

如果这两个方格颜色相同,返回 true,否则返回 false

坐标总是表示有效的棋盘方格。坐标的格式总是先字母(表示列),再数字(表示行)。

bool checkTwoChessboards(char* coordinate1, char* coordinate2) {
    
    int col1 = coordinate1[0] - 'a';
    int row1 = coordinate1[1] - '1';
    // 获取第二个坐标的列和行
    int col2 = coordinate2[0] - 'a';
    int row2 = coordinate2[1] - '1';

    // 判断两个坐标所在格子颜色是否相同
    bool color1 = (col1 + row1) % 2 == 0;
    bool color2 = (col2 + row2) % 2 == 0;

    return color1 == color2;
}

第六天

一最多的行

一最多的行https://leetcode.cn/problems/row-with-maximum-ones/

给你一个大小为 m x n 的二进制矩阵 mat ,请你找出包含最多 1 的行的下标(从 0 开始)以及这一行中 1 的数目。

如果有多行包含最多的 1 ,只需要选择 行下标最小 的那一行。

返回一个由行下标和该行中 1 的数量组成的数组。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* rowAndMaximumOnes(int** mat, int matSize, int* matColSize, int* returnSize) {
    
    int row = 0;
    int num = 0;
    int* ans = (int*)malloc(sizeof(int)*2);
    *returnSize = 2;

    for(int i = 0; i < matSize;i ++){
        int n = 0;
        for(int j = 0;j < matColSize[i];j++){
            n += mat[i][j];
        }
        if(n > num){
            row = i;
            num = n;
        }
    }

    ans[0] = row;
    ans[1] = num;
    return ans;
}

执行操作可获得的最大总奖励

执行操作可获得的最大总奖励https://leetcode.cn/problems/maximum-total-reward-using-operations-i/

给你一个整数数组 rewardValues,长度为 n,代表奖励的值。

最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 

  • 从区间 [0, n - 1] 中选择一个 未标记 的下标 i
  • 如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i] 加到 x 上(即 x = x + rewardValues[i]),并 标记 下标 i

以整数形式返回执行最优操作能够获得的 最大 总奖励。

int cmp(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}

int maxTotalReward(int *rewardValues, int rewardValuesSize) {
    qsort(rewardValues, rewardValuesSize, sizeof(int), cmp);
    int m = rewardValues[rewardValuesSize - 1];
    int* dp = (int*)malloc(2 * m * sizeof(int));
    memset(dp, 0, 2 * m * sizeof(int));
    dp[0] = 1;
    for (int i = 0; i < rewardValuesSize; i++) {
        int x = rewardValues[i];
        for (int k = 2 * x - 1; k >= x; k--) {
            if (dp[k - x] == 1) {
                dp[k] = 1;
            }
        }
    }
    int res = 0;
    for (int i = 0; i < 2 * m; i++) {
        if (dp[i] == 1) {
            res = i;
        }
    }
    free(dp);
    return res;
}

按位与结果大于零的最长数组

按位与结果大于零的最长组合https://leetcode.cn/problems/largest-combination-with-bitwise-and-greater-than-zero/

对数组 nums 执行 按位与 相当于对数组 nums 中的所有整数执行 按位与 。

  • 例如,对 nums = [1, 5, 3] 来说,按位与等于 1 & 5 & 3 = 1 。
  • 同样,对 nums = [7] 而言,按位与等于 7 。

给你一个正整数数组 candidates 。计算 candidates 中的数字每种组合下 按位与 的结果。

返回按位与结果大于 0 的 最长 组合的长度

// 计算从低到高第 k 个二进制位数值为 1 的元素个数
int maxlen(int* candidates, int candidatesSize, int k) {
    int res = 0;
    for (int i = 0; i < candidatesSize; ++i) {
        if (candidates[i] & (1 << k)) {
            ++res;
        }
    }
    return res;
}

int largestCombination(int* candidates, int candidatesSize) {
    int res = 0;
    for (int i = 0; i < 24; ++i) {
        // 遍历二进制位
        res = fmax(res, maxlen(candidates, candidatesSize, i));
    }
    return res;
}

第七天

判断一个括号字符串是否有效

判断一个括号字符串是否有效https://leetcode.cn/problems/check-if-a-parentheses-string-can-be-valid/

一个括号字符串是只由 '(' 和 ')' 组成的 非空 字符串。如果一个字符串满足下面 任意 一个条件,那么它就是有效的:

  • 字符串为 ().
  • 它可以表示为 ABA 与 B 连接),其中A 和 B 都是有效括号字符串。
  • 它可以表示为 (A) ,其中 A 是一个有效括号字符串。

给你一个括号字符串 s 和一个字符串 locked ,两者长度都为 n 。locked 是一个二进制字符串,只包含 '0' 和 '1' 。对于 locked 中 每一个 下标 i :

  • 如果 locked[i] 是 '1' ,你 不能 改变 s[i] 。
  • 如果 locked[i] 是 '0' ,你 可以 将 s[i] 变为 '(' 或者 ')' 。

如果你可以将 s 变为有效括号字符串,请你返回 true ,否则返回 false 。

bool canBeValid(char* s, char* locked) {
    int n = strlen(s);
    int mx = 0;   // 可以达到的最大分数
    int mn = 0;   // 可以达到的最小分数 与 最小有效前缀对应分数 的较大值
    for (int i = 0; i < n; ++i) {
        if (locked[i] == '1') {
            // 此时对应字符无法更改
            int diff;
            if (s[i] == '(') {
                diff = 1;
            } else {
                diff = -1;
            }
            mx += diff;
            mn = fmax(mn + diff, (i + 1) % 2);
        } else {
            // 此时对应字符可以更改
            ++mx;
            mn = fmax(mn - 1, (i + 1) % 2);
        }
        if (mx < mn) {
            // 此时该前缀无法变为有效前缀
            return false;
        }
    }
    // 最终确定 s 能否通过变换使得分数为 0(成为有效字符串)
    return mn == 0;
}

两个数组的交集

两个数组的交集 IIhttps://leetcode.cn/problems/intersection-of-two-arrays-ii/

 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

// 比较函数,用于 qsort
int compare(const void * a, const void * b) {
    return ( *(int*)a - *(int*)b );
}

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    // 为结果数组分配可能的最大内存
    int* ans = (int*)malloc(sizeof(int) * (nums1Size < nums2Size ? nums1Size : nums2Size));
    int n = 0;

    // 对两个数组进行排序
    qsort(nums1, nums1Size, sizeof(int), compare);
    qsort(nums2, nums2Size, sizeof(int), compare);

    int n1 = 0;
    int n2 = 0;

    while (n1 < nums1Size && n2 < nums2Size) {
        if (nums1[n1] < nums2[n2]) {
            n1++;
        } else if (nums1[n1] > nums2[n2]) {
            n2++;
        } else {
            ans[n] = nums1[n1];
            n++;
            n1++;
            n2++;
        }
    }

    *returnSize = n;
    return ans;
}


超过阈值的最少操作数

超过阈值的最少操作数 IIhttps://leetcode.cn/problems/minimum-operations-to-exceed-threshold-value-ii/

 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。

你可以对 nums 执行一些操作,在一次操作中,你可以:

  • 选择 nums 中 最小 的两个整数 x 和 y 。
  • 将 x 和 y 从 nums 中删除。
  • 将 min(x, y) * 2 + max(x, y) 添加到数组中的任意位置。

注意,只有当 nums 至少 包含两个元素时,你才可以执行以上操作。

你需要使数组中的所有元素都 大于或等于 k ,请你返回需要的 最少 操作次数。

class Solution {
public:
    int minOperations(vector<int> &nums, int k) {
        int res = 0;
        priority_queue<long long, vector<long long>, greater<long long>> pq(nums.begin(), nums.end());
        while (pq.top() < k) {
            long long x = pq.top(); pq.pop();
            long long y = pq.top(); pq.pop();
            pq.push(x + x + y);
            res++;
        }
        return res;
    }
};

总结

这一周平平无奇 周末简单放松了一下 继续备战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity3D脚本与系统设计6】鼠标触摸超时待机实现

实现步骤 在Unity中实现一个功能&#xff0c;当鼠标或触摸超过一定时间没有操作时&#xff0c;自动返回待机界面。 检测输入 首先&#xff0c;我需要检测用户的输入&#xff0c;无论是鼠标还是触摸。Unity的Input系统可以检测到鼠标和触摸事件&#xff0c;比如Input.GetAxis…

C++学习之路:从头搞懂配置VScode开发环境的逻辑与步骤

目录 编辑器与IDE基于vscode的C开发环境配置1. 下载vscode、浅尝编译。番外篇 2. 安装插件&#xff0c;赋能编程。3. 各种json文件的作用。c_cpp_properties.jsontask.jsonlaunch.json 总结&&彩蛋 编辑器与IDE 上一篇博客已经介绍过了C程序的一个编译流程&#xff0c;从…

Web3与网络安全:如何确保去中心化应用的安全性

Web3与网络安全&#xff1a;如何确保去中心化应用的安全性 随着区块链技术的蓬勃发展&#xff0c;Web3的概念逐渐成为互联网发展的新趋势。Web3强调去中心化、用户主权和数据隐私&#xff0c;它的核心是构建一个更加开放、透明和安全的网络环境。然而&#xff0c;随着去中心化…

插值法笔记 ——武汉理工统计 周

第二章 插值法 插值法定义 插值函数定义 设函数 y f ( x ) y f(x) yf(x) 在区间 [a,b] 上有定义&#xff0c;且满足节点排列&#xff1a; a ≤ x 0 < x 1 < ⋯ < x n ≤ b a \leq x_0 < x_1 < \cdots < x_n \leq b a≤x0​<x1​<⋯<xn​≤b …

23种设计模式-命令(Command)设计模式

命令设计模式 &#x1f6a9;什么是命令设计模式&#xff1f;&#x1f6a9;命令设计模式的特点&#x1f6a9;命令设计模式的结构&#x1f6a9;命令设计模式的优缺点&#x1f6a9;命令设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是命令设计模式…

和鲸科技执行总裁殷自强受邀主讲华中附属同济医院大模型应用通识首期课程

当前&#xff0c;医学与人工智能的深度融合正迎来历史性发展机遇。华中科技大学同济医学院附属同济医院&#xff08;以下简称“同济医院”&#xff09;作为医疗人工智能应用的先行探索者&#xff0c;已在电子病历辅助书写、科研数据分析、医疗合同自动化审核等关键场景完成试点…

使用 Go 构建 MCP Server

一个互联网技术玩家&#xff0c;一个爱聊技术的家伙。在工作和学习中不断思考&#xff0c;把这些思考总结出来&#xff0c;并分享&#xff0c;和大家一起交流进步。 一、MCP 介绍 1. 基本介绍 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是…

C语言贪吃蛇实现

When the night gets dark,remember that the Sun is also a star. 当夜幕降临时&#xff0c;请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…

利用zabbix自带key获取数据

获取数据的三种方法 1、链接模版 服务器系统自身的监控 CPU CPU使用率、CPU负载 内存 内存剩余量 硬盘 关键性硬盘的剩余量、IO 网卡 流量/IO&#xff08;流入流量、流出流量、总流量、错误数据包流量&#xff09; 进程数 用户数 2、利用zabbix自带的键值key 1&#xff09;监…

无人机数据处理系统设计要点与难点!

一、系统设计要点 无人机数据处理系统需要高效、可靠、低延迟地处理多源异构数据&#xff08;如影像、传感器数据、位置信息等&#xff09;&#xff0c;同时支持实时分析和长期存储。以下是核心设计要点&#xff1a; 1.数据采集与预处理 多传感器融合&#xff1a;集成摄像头…

最大异或对 The XOR Largest Pair

题目来自洛谷网站&#xff1a; 思路&#xff1a; 两个循环时间复杂度太高了&#xff0c;会超时。 我们可以先将读入的数字&#xff0c;插入到字典树中&#xff0c;从高位到低位。对每个数查询的时候&#xff0c;题目要求是最大的异或对&#xff0c;所以我们选择相反的路径&am…

基于SpringBoot + Vue 的汽车租赁管理系统

技术介绍&#xff1a; ①&#xff1a;架构: B/S、MVC ②&#xff1a;系统环境&#xff1a;Windows/Mac ③&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql ④&#xff1a;技术栈&#xff1a;Java、Mysql、SpringBoot、Mybatis、Vue 项目功能&#xff1a; 角色&am…

基于DrissionPage的TB商品信息采集与可视化分析

一、项目背景 随着电子商务的快速发展,淘宝作为中国最大的电商平台之一,拥有海量的商品信息。这些数据对于市场分析、用户行为研究以及竞争情报收集具有重要意义。然而,由于淘宝的反爬虫机制和复杂的页面结构,直接获取商品信息并不容易。尤其是在电商行业高速发展的今天,商…

电气、电子信息与通信工程的探索与应用

从传统定义来看&#xff0c;电气工程是现代科技领域的核心学科和关键学科。它涵盖了创造产生电气与电子系统的有关学科的总和。然而&#xff0c;随着科学技术的飞速发展&#xff0c;电气工程的概念已经远超出这一范畴。 电子信息工程则是将电子技术、通信技术、计算机技术等应…

Python备赛笔记2

1.区间求和 题目描述 给定a1……an一共N个整数&#xff0c;有M次查询&#xff0c;每次需要查询区间【L,R】的和。 输入描述: 第一行包含两个数&#xff1a;N,M 第二行输入N个整数 接下来的M行&#xff0c;每行有两个整数&#xff0c;L R&#xff0c;中间用空格隔开&…

Unity2022发布Webgl2微信小游戏部分真机黑屏

复现规律&#xff1a; Unity PlayerSetting中取消勾选ShowSplashScreen 分析&#xff1a; 在Unity中&#xff0c;Splash Screen&#xff08;启动画面&#xff09; 不仅是视觉上的加载动画&#xff0c;还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…

记一次线上SQL死锁事故

一、 引言 SQL死锁是一个常见且复杂的并发控制问题。当多个事务在数据库中互相等待对方释放锁时&#xff0c;就会形成死锁&#xff0c;从而导致事务无法继续执行&#xff0c;影响系统的性能和可用性。死锁不仅会导致数据库操作的阻塞&#xff0c;增加延迟&#xff0c;还可能对…

Axure项目实战:智慧城市APP(六)市民互动(动态面板、显示与隐藏)

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;市民互动 主要内容&#xff1a;动态面板、显示与隐藏交互应用 应用场景&#xff1a;AI产品交互、互动类应用 案例展示&#xff1a; 案例视频&am…

为何服务器监听异常?

报错&#xff1a; 执行./RCF后出现监听异常--在切换网络后&#xff0c;由于前面没有退出./RCF执行状态&#xff1b;重新连接后&#xff0c;会出现服务器监听异常 原因如下&#xff1a; 由于刚开始登录内网&#xff0c;切换之后再重新登录内网&#xff0c;并且切换网络的过程中…

1.认识Excel

一 Excel 可以用来做什么 二 提升技巧 1.数据太多 2.计算太累 3.提升数据的价值和意义 4.团队协作 三 学习目标 学习目标不是为了掌握所有的技能&#xff0c;追逐新功能。而是学知识来解决需求&#xff0c;如果之前的技能和新出的技能都可以解决问题&#xff0c;那不学新技能也…