具体思想:
误打误撞想到了中位数可能是最优解,判断奇偶取中位数;
二分思路最重要的是和谁比的问题;
要么mid+1和mid比,要么mid和nums[mid]+1比;
但是前者需要去重,后者为什么能成功不太明确;
具体代码:
1.中位数:
class Solution {
public:
int minMoves2(vector<int>& nums) {
sort(nums.begin(),nums.end());
if(nums.size()%2==1){
return fun(nums[nums.size()/2],nums);
}else{
return min(fun(nums[nums.size()/2],nums),fun(nums[nums.size()/2-1],nums));
}
}
int fun(int n,vector<int>& nums){
int cnt=0;
for(auto& m:nums){
cnt+=abs(n-m);
}
return cnt;
}
};
2.二分思路:
class Solution {
public:
int minMoves2(vector<int>& nums) {
sort(nums.begin(),nums.end());
set<int>se;
for(auto& num:nums){
se.insert(num);
}
vector<int>nnums(se.begin(),se.end());
int l=0,r=nnums.size()-1;
while(l<r){
int mid=l+(r-l)/2;
if(mysum(nums,nnums[mid])<mysum(nums,nnums[mid+1]))
r=mid;
else
l=mid+1;
}
return mysum(nums, nnums[l]);
}
long long mysum(vector<int>& nums,int n){
long long cnt=0;
for(int i=0;i<nums.size();i++){
cnt+=abs(nums[i]-n);
}
return cnt;
}
};
/*
class Solution {
public:
int minMoves2(vector<int>& nums) {
sort(nums.begin(),nums.end());
int l=0,r=nums.size()-1,mid;
while(l<r){
mid=(l+r)>>1;
if(sumof(nums[mid],nums)<sumof(nums[mid]+1,nums)) r=mid;
else l=mid+1;
}
return sumof(nums[l],nums);
}
long sumof(int n,vector<int>& nums){
long sum=0;
for(int i=0;i<nums.size();i++){
sum+=abs(nums[i]-n);
}
return sum;
}
};
*/