2026-04-24:最大和最小 K 個元素的絕對差。用go語言,給定整數數組 nums 和整數 k,分別取出數組里最大的 k 個數并求它們的和;再取出數組里最小的 k 個數并求它們的和。最后計算這兩個和之間的差值的絕對值,并返回該結果。
1 <= n == nums.length <= 100。
1 <= nums[i] <= 100。
1 <= k <= n。
輸入: nums = [5,2,2,4], k = 2。
輸出: 5。
解釋:
k = 2 個最大的元素是 4 和 5。它們的總和是 4 + 5 = 9。
k = 2 個最小的元素是 2 和 2。它們的總和是 2 + 2 = 4。
絕對差值是 abs(9 - 4) = 5。
題目來自力扣3774。
代碼執行過程
我們以輸入nums = [5, 2, 2, 4],k = 2為例,完整拆解執行步驟:
第一步:定義求和工具函數
程序先定義了一個sum函數,作用是接收一個整數切片,遍歷里面所有數字并累加,返回最終的總和,專門用來計算數組片段的和。
第二步:執行核心計算函數 absDifference
這是實現題目要求的核心函數,執行步驟如下:
1.對原數組進行升序排序
傳入的數組是[5,2,2,4],排序后從小到大排列為:[2, 2, 4, 5]。2.截取最小的 k 個元素并求和
排序后的數組前 k 個元素就是最小的 k 個數,這里 k=2,截取片段為[2, 2];
調用sum函數遍歷累加,得到最小 k 個數的和:2+2=4。3.截取最大的 k 個元素并求和
排序后的數組最后 k 個元素就是最大的 k 個數,這里 k=2,截取片段為[4, 5];
調用sum函數遍歷累加,得到最大 k 個數的和:4+5=9。4.計算兩個和的差值
用最大 k 數的和 減去 最小 k 數的和:9 - 4 = 5;
因為題目要求絕對差值,而最大和一定大于等于最小和,所以差值本身就是最終結果。
1. 在
main函數中定義測試用的數組nums和整數k;2. 調用核心函數
absDifference得到計算結果 5;3. 將結果打印輸出,控制臺顯示
5。
時間復雜度由代碼中最耗時的操作決定:
? 核心耗時操作:數組排序,Go 語言
slices.Sort對整型切片排序的時間復雜度為O(n log n)(n 是數組長度);? 求和操作:兩次遍歷長度為 k 的切片,總時間為 O(k),遠小于排序的耗時;
? 其他操作(截取切片、減法)都是常數時間 O(1)。
因此,總的時間復雜度為 O(n log n)。
2. 總額外空間復雜度
額外空間指除了輸入數據外,程序運行時額外開辟的內存空間:
?
slices.Sort是原地排序,不會開辟新的數組空間;? 切片截取操作只是創建新的切片引用,不復制底層數組數據;
? 僅使用了少量變量存儲和、臨時值,占用常數空間;
因此,總的額外空間復雜度為 O(1)(常數級空間)。
總結
1. 執行核心流程:排序數組 → 取前k小求和 → 取后k大求和 → 計算差值;
2. 總時間復雜度:O(n log n)(由排序操作決定);
3. 總額外空間復雜度:O(1)(原地操作,無額外內存開銷)。
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):
"""計算列表元素的和"""
return sum(a)
def abs_difference(nums, k):
"""計算最大k個元素之和與最小k個元素之和的差"""
nums.sort() # 原地排序
# 最大k個元素之和 - 最小k個元素之和
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());
// 計算前k個元素的和
int sumMin = std::accumulate(nums.begin(), nums.begin() + k, 0);
// 計算后k個元素的和
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;
}
我們相信人工智能為普通人提供了一種“增強工具”,并致力于分享全方位的AI知識。在這里,您可以找到最新的AI科普文章、工具評測、提升效率的秘籍以及行業洞察。 歡迎關注“福大大架構師每日一題”,發消息可獲得面試資料,讓AI助力您的未來發展。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
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.