這是代碼462. 我有一個算法,但是在傳遞其他數據時失敗了一些測試。 我試圖通過但不知道什麼是我忽視的角落案件。我們有一個由N個元素組成的數組。一種移動被定義爲增加或減少數組中的一個單一元素1.我們試圖找到使所有元素相等的最小移動次數。如果我們可以增加/減少一個特定的數組元素,最小總移動數量爲1
我的想法是:1。 發現平均 2.最近發現的元素平均 3.總和在一起,每個元素和最接近平均值的元素之間的差異。 我錯過了什麼?請提供一個反例。
class Solution {
public:
int minMoves2(vector<int>& nums) {
int sum=0;
for(int i=0;i<nums.size();i++){
sum += nums[i];
}
double avg = (double) sum/nums.size();
int min = nums[0];
int index =0 ;
for(int i=0;i<nums.size();i++){
if(abs(nums[i]-avg) <= abs(min - avg)){
min = nums[i];
index = i;
}
}
sum=0;
for(int i=0;i<nums.size();i++){
sum += abs(min - nums[i]);
}
return sum;
}
};
好的。謝謝。我現在知道了。建立一個T並分析對它上面和下面的數字的影響,這是如此驚人的想法。 – cxf54
是的,這個問題可以通過二分查找來解決。 – vish4071
@ vish4071我不明白。所有你需要的是快速選擇找到中位數,然後單次傳球。這全是O(N)。二進制搜索意味着排序是NlogN。 –