LeetCode 561:數組拆分 I Array Partition I

文章所有來自公衆號:愛寫bugjava

算法是一個程序的靈魂。 Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible.算法

給定長度爲 2n 的數組, 你的任務是將這些數分紅 n 對, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得從1 到 n 的 min(ai, bi) 總和最大。數組

Example 1:函數

Input: [1,4,3,2]

Output: 4
Explanation: n is 2, and the maximum sum of pairs is 4 = min(1, 2) + min(3, 4).

Note:性能

  1. n is a positive integer, which is in the range of [1, 10000].
  2. All the integers in the array will be in the range of [-10000, 10000].

提示:ui

  1. n 是正整數,範圍在 [1, 10000].
  2. 數組中的元素範圍在 [-10000, 10000].

解題思路:

​ 其實就是把 數組排序,而後按順序 每兩個數既是一對,每對的第一個數累加之和即爲所求。就是考一下各種排序算法的性能。code

先使用內置 sort() 函數理解一下思路:blog

Java:排序

import java.util.Arrays;
class Solution {
    public int arrayPairSum(int[] nums) {
        Arrays.sort(nums);
        int sum=0;
        for (int i=0;i<nums.length;i+=2){
            sum+=nums[i];
        }
        return sum;
    }
}

擴展:遞歸

維基百科上對排序算法介紹的很是詳細,而且進行了歸類比較,地址: https://zh.wikipedia.org/wiki/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95

這裏簡單推薦兩個:

  • 快速排序(quick sort)—O(n\log n)指望時間,O(n^{2})最壞狀況;對於大的、隨機數列表通常相信是最快的已知排序(C語言標準庫的qsort()排序用的就是快速排序算法,利用遞歸和分而治之思想)
  • 桶排序(bucket sort)—O(n);須要O(k)額外空間(典型的犧牲空間換時間)

冒泡排序、選擇排序都是比較簡單容易理解,複雜度是 n^2 ,因此再也不贅述。

561_ArrayPartitionI_wiki

相關文章
相關標籤/搜索