目录
- 3131. 找出与数组相加的整数 I 简单
- 3132. 找出与数组相加的整数 II 中等
- 3133. 数组最后一个元素的最小值 中等
- 3134. 找出唯一性数组的中位数 困难
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;
}