Go語言題解LeetCode561數(shù)組拆分
一 描述
561. 數(shù)組拆分 I - 力扣(LeetCode) (leetcode-cn.com)
給定長度為 2n
的整數(shù)數(shù)組 nums
,你的任務(wù)是將這些數(shù)分成 n
對, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得從 1 到 n 的 min(ai, bi) 總和最大。
返回該 最大總和 。
示例 1:
輸入:nums = [1,4,3,2] 輸出:4 解釋:所有可能的分法(忽略元素順序)為: 1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3 2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3 3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4 所以最大總和為 4
示例 2:
輸入:nums = [6,2,6,5,1,2] 輸出:9 解釋:最優(yōu)的分法為 (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9
提示:
1 <= n <= 10^4
nums.length == 2 * n
-10^4 <= nums[i] <= 10^4
二 分析
本質(zhì)思路是將整個隊列按從小到大的方式排序,然后從兩個相近的數(shù)中選取出最小的,取和。使用冒泡法會超出計算時間,因為選用額外增加數(shù)組,將大小作為兩個數(shù)組的下角標,從而進行排序。
三 答案
class Solution { public: int arrayPairSum(vector<int>& nums) { /* int arr[nums.size()]={0}; int temp=0; for(int i=0;i<nums.size();i++) arr[i]=nums[i]; for(int i=0;i<nums.size()-1;i++) { for(int j=i+1;j<nums.size();j++) if(arr[i]>arr[j]) {temp=arr[i];arr[i]=arr[j];arr[j]=temp;} //冒泡排序會超出時間限制 } int res=0; for(int i=0;i<nums.size();i+=2){res+=arr[i];} return res;*/ int n[20001]={0},i=0,j=0,sum=0; for(i=0;i<nums.size();i++) n[nums[i]+10000]++; //變相將nums按順序大小排好,并將順序存儲在n[i]中 for(i=0;i<20001;) { if(n[i]) { if(j%2==0) sum+=i-10000; //按照n[i]中存儲的順序,求得nums[i] j++; //只有n[i]中有數(shù)時,即nums存在這個數(shù)時,j才增加,將j變?yōu)橄陆菢? n[i]--; //此步防止nums中含有兩個相同的數(shù) } else i++; } return sum; } };
Python 語言 - 數(shù)組拆分
解題思路
排序
今天的題目意思為:把輸入的數(shù)組拆成 nn 對,將每一對的最小值求和,得到的結(jié)果最大。
從題目給出的示例入手分析:
對于示例二 [6,2,6,5,1,2] :
題目給出了最優(yōu)分法是 (2, 1), (2, 5), (6, 6),min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9。
假如我們換一種分法:(2, 6), (2, 5), (1, 6),min(2, 6) + min(2, 5) + min(1, 6) = 2 + 2 + 1 = 5,則得到的最終結(jié)果會變小。
可以看出小數(shù)字組成一對、大數(shù)字組成一對,每對取 minmin 之后,求和得到的結(jié)果才是最大的。
因此,思路就是對輸入的數(shù)組 numsnums 進行排序,然后依次求相鄰的兩個元素的最小值,總和就是結(jié)果。
代碼一
一種各種語言都比較通用的寫法是下面這樣,用 Python 作為示例:
class Solution(object): def arrayPairSum(self, nums): nums.sort() res = 0 for i in range(0, len(nums), 2): res += min(nums[i], nums[i + 1]) return res
時間復(fù)雜度:O(N * log(N)),超過了 31% 的提交。
空間復(fù)雜度:O(1)。
代碼二
對于 Python 而言,我們可以用切片操作,把代碼簡化為:
class Solution(object): def arrayPairSum(self, nums): nums.sort() return sum(nums[::2])
時間復(fù)雜度:O(N * log(N)),超過了 100% 的提交,可見切片比 for 循環(huán)更快。
空間復(fù)雜度:O(N),切片操作產(chǎn)生了新的數(shù)組,占用了空間。
代碼三
對于 Python 而言,上面的代碼二還能繼續(xù)精簡到一行。由于 nums.sort() 是原地操作、沒有返回值,所以我們需要用 sorted(nums) 函數(shù)返回一個新數(shù)組,我們才能在返回結(jié)果的基礎(chǔ)上繼續(xù)進行切片。
class Solution(object): def arrayPairSum(self, nums): return sum(sorted(nums)[::2])
時間復(fù)雜度:O(N * log(N)),超過了 63% 的提交,比方法二更慢。應(yīng)該是 sorted() 函數(shù)拷貝了數(shù)組導(dǎo)致。
空間復(fù)雜度:O(N),sorted() 函數(shù)和切片操作產(chǎn)生了新的數(shù)組,占用了空間。
刷題心得
Easy 題經(jīng)常從示例入手,分析解法。
本題練習(xí)了 Python 的切片操作,也練習(xí)了兩種排序函數(shù)的寫法。
以上就是Go語言題解LeetCode561數(shù)組拆分的詳細內(nèi)容,更多關(guān)于Go語言數(shù)組拆分的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang map如何生成有序的json數(shù)據(jù)詳解
最近在學(xué)習(xí)Golang,發(fā)現(xiàn)了一個問題,覺著有必要給大家總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于Golang map如何生成有序json數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面來一起看看吧。2017-07-07go內(nèi)存緩存BigCache之Entry封裝源碼閱讀
這篇文章主要介紹了go內(nèi)存緩存BigCache之Entry封裝源碼閱讀2023-09-09golang復(fù)用http.request.body的方法示例
這篇文章主要給大家介紹了關(guān)于golang復(fù)用http.request.body的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10