排序后相减。
class Solution {
public:
int addedInteger(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
return nums2[0]-nums1[0];
}
};
由于最多移除两个整数,所以枚举每一种情况
class Solution {
public:
int minimumAddedInteger(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size(),m=nums2.size();
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int k=nums2[m-1]-nums1[n-1];
int cnt=0;
for(int i=n-1,j=m-1;j>=0&&cnt<=2;)
{
if(nums1[i]+k==nums2[j])
{
i--;
j--;
}
else
{
i--;
cnt++;
}
}
if(cnt<=2)
return k;
k=nums2[m-1]-nums1[n-2];
cnt=0;
for(int i=n-2,j=m-1;j>=0&&cnt<=1;)
{
if(nums1[i]+k==nums2[j])
{
i--;
j--;
}
else
{
i--;
cnt++;
}
}
if(cnt<=1)
return k;
return nums2[m-1]-nums1[n-3];
}
};
此题涉及到位运算,需要按位分解,若要让所有元素按位与结果为x,那么如果x此位为1,那么所有元素此位都必须为1,而其他位则随便。
class Solution {
public:
typedef long long LL;
long long minEnd(int n, int x) {
LL sum=x;
LL s=0,v=0;
while(s<30)
{
LL temp=(n-1)&(1<<s);
temp<<=v;
LL sign =sum&(1LL<<(s+v));
if(sign==0)
{
sum|=temp;
s++;
}
else
v++;
}
return sum;
}
};
在 0 ~ n 中二分 k,若 k 得出的可选子数组数量覆盖了中位数下标,那么 k 就是答案,具体求可选子数组数量,可以用滑动窗口来求。
class Solution {
public:
typedef long long LL;
LL check(vector<int>& nums,int k)
{
int n=nums.size();
int l=0;
unordered_map<int,int> m;
LL cnt=0;
for(int r=0;r<n;r++)
{
m[nums[r]]++;
while(m.size()>k)
{
m[nums[l]]--;
if(m[nums[l]]==0)
{
m.erase(nums[l]);
}
l++;
}
cnt+=r-l+1;
}
return cnt;
}
int medianOfUniquenessArray(vector<int>& nums) {
int n=nums.size();
int l=0,r=n;
LL midnum=((LL)(n+1)*n/2+1)/2;
while(l<r)
{
int mid=(l+r)>>1;
if(check(nums,mid)<midnum)
l=mid+1;
else
r=mid;
}
return r;
}
};