(java)leetcode561 陣列拆分1(Array Partition 1)
阿新 • • 發佈:2018-11-01
題目描述:
給定長度為 2n 的陣列, 你的任務是將這些數分成 n 對, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得從1 到 n 的 min(ai, bi) 總和最大。
示例:
輸入: [1,4,3,2]
輸出: 4
解釋: n 等於 2, 最大總和為 4 = min(1, 2) + min(3, 4).
提示:
- n 是正整數,範圍在 [1, 10000].
- 陣列中的元素範圍在 [-10000, 10000].
解題思路:
這一題實現起來並不難,主要是要知道再什麼樣的情況下這個和才是最大的,然後就知道要怎麼去解決。首先是將陣列分成N對,然後找出每一對中的最小值,使得這些最小值加起來最大。我們要做的就是使這些最小值儘量的大,那這就要求每一對的兩個數之間的差值儘可能的小。到這裡我們就明白了這題要怎麼做了,其實就是一個數組的排序,然後將沒兩個挨在一起的數分為一組,取出最小值求和,若是從小到大排序,那就是求出下表為偶數的值的和。
我這裡採用的Java 陣列自帶的排序方法,如果想要提高演算法效率,可以自己重新寫一個排序演算法,可以參考我的另一篇博文《十大經典排序演算法(動圖演示)》。
程式碼實現(java):
class Solution { public int arrayPairSum(int[] nums) { int sum=0; //陣列從小到大排序 Arrays.sort(nums); for(int i=0;i<nums.length;i=i+2){ sum+=nums[i]; } return sum; } }
本人才疏學淺,若文中有錯誤或者有更好的方法,歡迎再評論區中指出,共同進步。