您好,登錄后才能下訂單哦!
這篇“java如何解決最少移動次數使數組元素相等的問題”文章,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要參考一下,對于“java如何解決最少移動次數使數組元素相等的問題”,小編整理了以下知識點,請大家跟著小編的步伐一步一步的慢慢理解,接下來就讓我們進入主題吧。
給定一個非空整數數組,找到使所有數組元素相等所需的最小移動數,其中每次移動可將選定的一個元素加1或減1。您可以假設數組的長度最多為10000。
例如:
輸入:
[1,2,3]
輸出:
2
說明:
只有兩個動作是必要的(記得每一步僅可使其中一個元素加1或減1):
[1,2,3] => [2,2,3] => [2,2,2]
答案:
1public int minMoves2(int[] nums) {
2 Arrays.sort(nums);
3 int i = 0, j = nums.length - 1;
4 int count = 0;
5 while (i < j) {
6 count += nums[j--] - nums[i++];
7 }
8 return count;
9}
解析:
這題其實更像是一道數學題,先來分析一下,我們假設把兩個數a,b(a<=b)經過最少的轉換最終變為x。這里有3種情況
1,x<=a,轉變次數為(a-x)+(b-x)=(a+b)-2x;
2,a<=x<=b,轉變次數為(x-a)+(b-x)=b-a;
3,x>=b,轉變次數為(x-a)+(x-b)=2x-(a+b);
所以很明顯第二種情況轉換的次數是最少的,也就是說x在a和b之間的時候,轉換的次數是最少的。我們可以使用極限法證明
1,當x=a時取最小值,最小值是(a+b)-2a=b-a;
3,當x=b時取最小值,最小值是2b-(a+b)=b-a;
所以這個問題就很好解決了,我們只需要把數組排好序,當數組長度為2的時候,只需要大的減小的即可,當數組長度為3的時候,我們只需要計算中間值與那兩個數差的絕對值的和即可(或者是最后一個減去第一個),當數組長度為n的時候,我們只需要找到最中間值,然后每一個數與他的差的絕對值相加即可。
Java中的集合主要分為四類:1、List列表:有序的,可重復的;2、Queue隊列:有序,可重復的;3、Set集合:不可重復;4、Map映射:無序,鍵唯一,值不唯一。
以上是“java如何解決最少移動次數使數組元素相等的問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。