2026-04-24:最大和最小 K 個(gè)元素的絕對(duì)差。用go語(yǔ)言,給定整數(shù)數(shù)組 nums 和整數(shù) k,分別取出數(shù)組里最大的 k 個(gè)數(shù)并求它們的和;再取出數(shù)組里最小的 k 個(gè)數(shù)并求它們的和。最后計(jì)算這兩個(gè)和之間的差值的絕對(duì)值,并返回該結(jié)果。
1 <= n == nums.length <= 100。
1 <= nums[i] <= 100。
1 <= k <= n。
輸入: nums = [5,2,2,4], k = 2。
輸出: 5。
解釋?zhuān)?/p>
k = 2 個(gè)最大的元素是 4 和 5。它們的總和是 4 + 5 = 9。
k = 2 個(gè)最小的元素是 2 和 2。它們的總和是 2 + 2 = 4。
絕對(duì)差值是 abs(9 - 4) = 5。
題目來(lái)自力扣3774。
代碼執(zhí)行過(guò)程
我們以輸入nums = [5, 2, 2, 4],k = 2為例,完整拆解執(zhí)行步驟:
第一步:定義求和工具函數(shù)
程序先定義了一個(gè)sum函數(shù),作用是接收一個(gè)整數(shù)切片,遍歷里面所有數(shù)字并累加,返回最終的總和,專(zhuān)門(mén)用來(lái)計(jì)算數(shù)組片段的和。
第二步:執(zhí)行核心計(jì)算函數(shù) absDifference
這是實(shí)現(xiàn)題目要求的核心函數(shù),執(zhí)行步驟如下:
1.對(duì)原數(shù)組進(jìn)行升序排序
傳入的數(shù)組是[5,2,2,4],排序后從小到大排列為:[2, 2, 4, 5]。2.截取最小的 k 個(gè)元素并求和
排序后的數(shù)組前 k 個(gè)元素就是最小的 k 個(gè)數(shù),這里 k=2,截取片段為[2, 2];
調(diào)用sum函數(shù)遍歷累加,得到最小 k 個(gè)數(shù)的和:2+2=4。3.截取最大的 k 個(gè)元素并求和
排序后的數(shù)組最后 k 個(gè)元素就是最大的 k 個(gè)數(shù),這里 k=2,截取片段為[4, 5];
調(diào)用sum函數(shù)遍歷累加,得到最大 k 個(gè)數(shù)的和:4+5=9。4.計(jì)算兩個(gè)和的差值
用最大 k 數(shù)的和 減去 最小 k 數(shù)的和:9 - 4 = 5;
因?yàn)轭}目要求絕對(duì)差值,而最大和一定大于等于最小和,所以差值本身就是最終結(jié)果。
1. 在
main函數(shù)中定義測(cè)試用的數(shù)組nums和整數(shù)k;2. 調(diào)用核心函數(shù)
absDifference得到計(jì)算結(jié)果 5;3. 將結(jié)果打印輸出,控制臺(tái)顯示
5。
時(shí)間復(fù)雜度由代碼中最耗時(shí)的操作決定:
? 核心耗時(shí)操作:數(shù)組排序,Go 語(yǔ)言
slices.Sort對(duì)整型切片排序的時(shí)間復(fù)雜度為O(n log n)(n 是數(shù)組長(zhǎng)度);? 求和操作:兩次遍歷長(zhǎng)度為 k 的切片,總時(shí)間為 O(k),遠(yuǎn)小于排序的耗時(shí);
? 其他操作(截取切片、減法)都是常數(shù)時(shí)間 O(1)。
因此,總的時(shí)間復(fù)雜度為 O(n log n)。
2. 總額外空間復(fù)雜度
額外空間指除了輸入數(shù)據(jù)外,程序運(yùn)行時(shí)額外開(kāi)辟的內(nèi)存空間:
?
slices.Sort是原地排序,不會(huì)開(kāi)辟新的數(shù)組空間;? 切片截取操作只是創(chuàng)建新的切片引用,不復(fù)制底層數(shù)組數(shù)據(jù);
? 僅使用了少量變量存儲(chǔ)和、臨時(shí)值,占用常數(shù)空間;
因此,總的額外空間復(fù)雜度為 O(1)(常數(shù)級(jí)空間)。
總結(jié)
1. 執(zhí)行核心流程:排序數(shù)組 → 取前k小求和 → 取后k大求和 → 計(jì)算差值;
2. 總時(shí)間復(fù)雜度:O(n log n)(由排序操作決定);
3. 總額外空間復(fù)雜度:O(1)(原地操作,無(wú)額外內(nèi)存開(kāi)銷(xiāo))。
package main
import (
"fmt"
"slices"
)
func sum(a []int) (s int) {
for _, x := range a {
s += x
}
return s
}
func absDifference(nums []int, k int)int {
slices.Sort(nums)
return sum(nums[len(nums)-k:]) - sum(nums[:k])
}func main() {
nums := []int{5, 2, 2, 4}
k := 2
result := absDifference(nums, k)
fmt.Println(result)
}
Python完整代碼如下:
# -*-coding:utf-8-*-
def sum_array(a):
"""計(jì)算列表元素的和"""
return sum(a)
def abs_difference(nums, k):
"""計(jì)算最大k個(gè)元素之和與最小k個(gè)元素之和的差"""
nums.sort() # 原地排序
# 最大k個(gè)元素之和 - 最小k個(gè)元素之和
return sum(nums[-k:]) - sum(nums[:k])
def main():
nums = [5, 2, 2, 4]
k = 2
result = abs_difference(nums, k)
print(result)if __name__ == "__main__":
main()
C++完整代碼如下:
int absDifference(std::vector& nums, int k) {
std::sort(nums.begin(), nums.end());
// 計(jì)算前k個(gè)元素的和
int sumMin = std::accumulate(nums.begin(), nums.begin() + k, 0);
// 計(jì)算后k個(gè)元素的和
int sumMax = std::accumulate(nums.end() - k, nums.end(), 0);
return sumMax - sumMin;
}int main() {
std::vector nums = {5, 2, 2, 4};
int k = 2;
int result = absDifference(nums, k);
std::cout << result << std::endl;
return0;
}
我們相信人工智能為普通人提供了一種“增強(qiáng)工具”,并致力于分享全方位的AI知識(shí)。在這里,您可以找到最新的AI科普文章、工具評(píng)測(cè)、提升效率的秘籍以及行業(yè)洞察。 歡迎關(guān)注“福大大架構(gòu)師每日一題”,發(fā)消息可獲得面試資料,讓AI助力您的未來(lái)發(fā)展。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶(hù)上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.