【LeetCode周赛】第 395 场周赛

3131. 找出与数组相加的整数 I 简单

3131. 找出与数组相加的整数 I

分析:
将两个数组中最小的两个值相减即可。

代码:
C++

class Solution {
public:
    int addedInteger(vector<int>& nums1, vector<int>& nums2) {
        ranges::sort(nums1);
        ranges::sort(nums2);
        return nums2[0] - nums1[0];
    }
};

Python

class Solution:
    def addedInteger(self, nums1: List[int], nums2: List[int]) -> int:
        return min(nums2) - min(nums1)


3132. 找出与数组相加的整数 II 中等

3132. 找出与数组相加的整数 II

分析:
枚举去除掉两个数之后,数组中最小的值,得到最小的差距。
去掉两个值,只需要考虑去掉最小的、去掉最小的和第二小、以及最小的仍然保留三种情况,因此对这三种情况进行枚举即可(不需要枚举后面的数的去除情况)。

代码:
C++
C++里面是枚举最大值,而且枚举了所有值。

class Solution {
public:
    int minimumAddedInteger(vector<int>& nums1, vector<int>& nums2) {
        ranges::sort(nums1);
        ranges::sort(nums2);
        int n = nums1.size(), m = nums2.size(), ans = 1e6+5;
        multiset<int> s;
        for(int i=n-1;i>=0;i--){
            int c = nums1[i] - nums2[m-1], cnt = 0;
            s.clear();
            for(int j=0;j<i;j++){
                s.insert(nums1[j]);
            }
            for(int j=0;j<m-1;j++){
                if(s.contains(nums2[j] + c)){
                    cnt++;
                    s.erase(s.find(nums2[j] + c));
                }
            }
            if(cnt>=m-1){
                ans = min(ans, -c);
            }
        }
        return ans;
    }
};

Python

class Solution:
    def minimumAddedInteger(self, nums1: List[int], nums2: List[int]) -> int:
        nums1.sort()
        nums2.sort()

        for i in range(2,0,-1):
            c = nums1[i] - nums2[0]
            print(c)
            count, index = 0, 0
            for j in nums1[i:]:
                if j - nums2[index] == c:
                    count += 1
                    index += 1
                if count == len(nums2):
                    return -c
        return nums2[0] - nums1[0]


3133. 数组最后一个元素的最小值 中等

3133. 数组最后一个元素的最小值

分析:
数组所有值 AND,最终结果为x,即其实值必须为x,且其他的数与 x 二进制 非 0 位必须一致。

法一:
在这里插入图片描述
在这里插入图片描述
经过样例的二进制计算,可以得到,最终即将 n-1 的二进制位填入x 的 二进制位中为0的部分,如果低位不够,则高位来补。

法二: 也可以以计数的方式来思考,分为低位和高位两部分(即x低位为0的部分和,高位),从低位开始从小到大填1,如果低位不够,则开始填高位。

代码:
C++ 法一:

class Solution {
public:
    long long minEnd(int n, int x) {
        n--;
        long long ans = x;
        int i = 0, j = 0;
        while(n >> j){
            if(((ans >> i) & 1) == 0){
                ans |= ((ans >> i & 1) | ((n >> j) & 1)) << i;
                j++;
            }
            i++;
        }
        return ans;
    }
};

C++ 法二:

class Solution {
public:
    long long minEnd(int n, int x) {
        long long ans, res = x;
        long long cnt = 1, p = 1, count = 0;
        vector<long long> s;
        s.push_back(0);
        while(x){
            if(x%2==0){
                cnt*=2;
                int l = s.size(); 
                for(int i=0;i<l;i++){
                    s.push_back(s[i] + p);
                }
            }
            x /= 2;
            p *= 2;
            count++;
        }
        ranges::sort(s);
        if(n<=s.size()) return res + s[n-1];
        else{
            res += (n+s.size()-1)/(int)s.size() - 1<<count;

        }
        return res + s[(n+s.size()-1)%s.size()];  
    }
};

Python 法一:

class Solution:
    def minEnd(self, n: int, x: int) -> int:
        n -= 1
        i, j = 0, 0
        ans = x
        while n >> j > 0:
            if ans >> i & 1 == 0:
                ans |= (((ans >> i) & 1) | ((n >> j) & 1)) << i
                j += 1
            i += 1
        return ans


3134. 找出唯一性数组的中位数 困难

3134. 找出唯一性数组的中位数

分析:
待完成。

代码:

#include<bits/stdc++>
int main(){
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值