Go語言題解LeetCode561數(shù)組拆分
一 描述
561. 數(shù)組拆分 I - 力扣(LeetCode) (leetcode-cn.com)
給定長度為 2n 的整數(shù)數(shù)組 nums ,你的任務是將這些數(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
時間復雜度:O(N * log(N)),超過了 31% 的提交。
空間復雜度:O(1)。
代碼二
對于 Python 而言,我們可以用切片操作,把代碼簡化為:
class Solution(object):
def arrayPairSum(self, nums):
nums.sort()
return sum(nums[::2])
時間復雜度:O(N * log(N)),超過了 100% 的提交,可見切片比 for 循環(huán)更快。
空間復雜度: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])
時間復雜度:O(N * log(N)),超過了 63% 的提交,比方法二更慢。應該是 sorted() 函數(shù)拷貝了數(shù)組導致。
空間復雜度:O(N),sorted() 函數(shù)和切片操作產(chǎn)生了新的數(shù)組,占用了空間。
刷題心得
Easy 題經(jīng)常從示例入手,分析解法。
本題練習了 Python 的切片操作,也練習了兩種排序函數(shù)的寫法。
以上就是Go語言題解LeetCode561數(shù)組拆分的詳細內(nèi)容,更多關(guān)于Go語言數(shù)組拆分的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
xorm根據(jù)數(shù)據(jù)庫生成go model文件的操作
這篇文章主要介紹了xorm根據(jù)數(shù)據(jù)庫生成go model文件的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
詳解Golang net/http包中的RoundTripper接口
RoundTripper 是 net/http 包中的一個接口,定義了處理 HTTP 請求返回和響應的方法,是 http.Client 結(jié)構(gòu)體中執(zhí)行 http 請求的核心部分,本文將詳細的給大家介紹Golang RoundTripper接口,需要的朋友可以參考下2023-09-09
golang實現(xiàn)unicode轉(zhuǎn)換為字符串string的方法
這篇文章主要介紹了golang實現(xiàn)unicode轉(zhuǎn)換為字符串string的方法,實例分析了Go語言編碼轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07
Go語言實現(xiàn)開發(fā)一個簡單的gRPC Demo
這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)開發(fā)一個簡單的gRPC Demo,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-07-07
go語言題解LeetCode1299將每個元素替換為右側(cè)最大元素
這篇文章主要為大家介紹了go語言LeetCode刷題1299將每個元素替換為右側(cè)最大元素示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
Golang實現(xiàn)文件夾的創(chuàng)建與刪除的方法詳解
這篇文章主要介紹了如何利用Go語言實現(xiàn)對文件夾的常用操作:創(chuàng)建于刪除。文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-05-05
使用Go語言創(chuàng)建error的幾種方式小結(jié)
Go語言函數(shù)(或方法)是支持多個返回值的,因此在Go語言的編程哲學中,函數(shù)的返回值的最后一個通常都是error類型,所以本文給大家介紹了使用Go語言創(chuàng)建error的幾種方式小結(jié),文中通過代碼示例講解的非常詳細,需要的朋友可以參考下2024-01-01

