Go語(yǔ)言題解LeetCode561數(shù)組拆分
一 描述
561. 數(shù)組拆分 I - 力扣(LeetCode) (leetcode-cn.com)
給定長(zhǎng)度為 2n
的整數(shù)數(shù)組 nums
,你的任務(wù)是將這些數(shù)分成 n
對(duì), 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得從 1 到 n 的 min(ai, bi) 總和最大。
返回該 最大總和 。
示例 1:
輸入:nums = [1,4,3,2] 輸出:4 解釋?zhuān)核锌赡艿姆址ǎê雎栽仨樞颍椋? 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 解釋?zhuān)鹤顑?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ì)思路是將整個(gè)隊(duì)列按從小到大的方式排序,然后從兩個(gè)相近的數(shù)中選取出最小的,取和。使用冒泡法會(huì)超出計(jì)算時(shí)間,因?yàn)檫x用額外增加數(shù)組,將大小作為兩個(gè)數(shù)組的下角標(biāo),從而進(jìn)行排序。
三 答案
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;} //冒泡排序會(huì)超出時(shí)間限制 } 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按順序大小排好,并將順序存儲(chǔ)在n[i]中 for(i=0;i<20001;) { if(n[i]) { if(j%2==0) sum+=i-10000; //按照n[i]中存儲(chǔ)的順序,求得nums[i] j++; //只有n[i]中有數(shù)時(shí),即nums存在這個(gè)數(shù)時(shí),j才增加,將j變?yōu)橄陆菢?biāo) n[i]--; //此步防止nums中含有兩個(gè)相同的數(shù) } else i++; } return sum; } };
Python 語(yǔ)言 - 數(shù)組拆分
解題思路
排序
今天的題目意思為:把輸入的數(shù)組拆成 nn 對(duì),將每一對(duì)的最小值求和,得到的結(jié)果最大。
從題目給出的示例入手分析:
對(duì)于示例二 [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é)果會(huì)變小。
可以看出小數(shù)字組成一對(duì)、大數(shù)字組成一對(duì),每對(duì)取 minmin 之后,求和得到的結(jié)果才是最大的。
因此,思路就是對(duì)輸入的數(shù)組 numsnums 進(jìn)行排序,然后依次求相鄰的兩個(gè)元素的最小值,總和就是結(jié)果。
代碼一
一種各種語(yǔ)言都比較通用的寫(xiě)法是下面這樣,用 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
時(shí)間復(fù)雜度:O(N * log(N)),超過(guò)了 31% 的提交。
空間復(fù)雜度:O(1)。
代碼二
對(duì)于 Python 而言,我們可以用切片操作,把代碼簡(jiǎn)化為:
class Solution(object): def arrayPairSum(self, nums): nums.sort() return sum(nums[::2])
時(shí)間復(fù)雜度:O(N * log(N)),超過(guò)了 100% 的提交,可見(jiàn)切片比 for 循環(huán)更快。
空間復(fù)雜度:O(N),切片操作產(chǎn)生了新的數(shù)組,占用了空間。
代碼三
對(duì)于 Python 而言,上面的代碼二還能繼續(xù)精簡(jiǎn)到一行。由于 nums.sort() 是原地操作、沒(méi)有返回值,所以我們需要用 sorted(nums) 函數(shù)返回一個(gè)新數(shù)組,我們才能在返回結(jié)果的基礎(chǔ)上繼續(xù)進(jìn)行切片。
class Solution(object): def arrayPairSum(self, nums): return sum(sorted(nums)[::2])
時(shí)間復(fù)雜度:O(N * log(N)),超過(guò)了 63% 的提交,比方法二更慢。應(yīng)該是 sorted() 函數(shù)拷貝了數(shù)組導(dǎo)致。
空間復(fù)雜度:O(N),sorted() 函數(shù)和切片操作產(chǎn)生了新的數(shù)組,占用了空間。
刷題心得
Easy 題經(jīng)常從示例入手,分析解法。
本題練習(xí)了 Python 的切片操作,也練習(xí)了兩種排序函數(shù)的寫(xiě)法。
以上就是Go語(yǔ)言題解LeetCode561數(shù)組拆分的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言數(shù)組拆分的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)支付寶支付與退款詳解
本文詳細(xì)介紹使用Go語(yǔ)言對(duì)接支付寶支付與退款功能的步驟和注意事項(xiàng),包括PC端、WAP端和Android端支付實(shí)現(xiàn),以及退款功能的代碼實(shí)現(xiàn),介紹了GoPay庫(kù)的使用,幫助開(kāi)發(fā)者快速集成支付寶支付到應(yīng)用中2024-10-10Golang map如何生成有序的json數(shù)據(jù)詳解
最近在學(xué)習(xí)Golang,發(fā)現(xiàn)了一個(gè)問(wèn)題,覺(jué)著有必要給大家總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于Golang map如何生成有序json數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧。2017-07-07go內(nèi)存緩存BigCache之Entry封裝源碼閱讀
這篇文章主要介紹了go內(nèi)存緩存BigCache之Entry封裝源碼閱讀2023-09-09Golang中的信號(hào)(Signal)機(jī)制詳解
Signal 是一種操作系統(tǒng)級(jí)別的事件通知機(jī)制,進(jìn)程可以響應(yīng)特定的系統(tǒng)信號(hào),這些信號(hào)用于指示進(jìn)程執(zhí)行特定的操作,如程序終止、掛起、恢復(fù)等,Golang 的標(biāo)準(zhǔn)庫(kù) os/signal 提供了對(duì)信號(hào)處理的支持,本文將詳細(xì)講解 Golang 是如何處理和響應(yīng)系統(tǒng)信號(hào)的,需要的朋友可以參考下2024-01-01Go語(yǔ)言的方法接受者類(lèi)型用值類(lèi)型還是指針類(lèi)型?
這篇文章主要介紹了Go語(yǔ)言的方法接受者類(lèi)型用值類(lèi)型還是指針類(lèi)型?本文還同時(shí)講解了關(guān)于接受者的命名方式,需要的朋友可以參考下2014-10-10golang復(fù)用http.request.body的方法示例
這篇文章主要給大家介紹了關(guān)于golang復(fù)用http.request.body的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10