1. 程式人生 > >(java)leetcode561 陣列拆分1(Array Partition 1)

(java)leetcode561 陣列拆分1(Array Partition 1)

題目描述:

給定長度為 2n 的陣列, 你的任務是將這些數分成 對, 例如 (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;
    }
}

本人才疏學淺,若文中有錯誤或者有更好的方法,歡迎再評論區中指出,共同進步。