1005 . K 次取反后最大化的數(shù)組和
給你一個整數(shù)數(shù)組 nums 和一個整數(shù) k ,按以下方法修改該數(shù)組:
選擇某個下標 i 并將 nums[i] 替換為 -nums[i] 。
重復(fù)這個過程恰好 k 次??梢远啻芜x擇同一個下標 i 。
以這種方式修改數(shù)組后,返回數(shù)組 可能的最大和 。
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
//首先進行按絕對值排序(需要熟悉用法)
nums = IntStream.of(nums)
.boxed()
.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
.mapToInt(Integer::intValue).toArray();
int len = nums.length;
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0 && k > 0) {//對其中的絕對值較大的負數(shù)進行反轉(zhuǎn),變?yōu)檎龜?shù)
nums[i] = - nums[i];
k--;
}
}
if (k % 2 == 1) {//如果K仍有剩余,取絕對值最小的一個元素進行反復(fù)取反;另外注意:k為偶數(shù)兩次取反抵消,無需操作,k為奇數(shù),相當于取反依次
nums[len - 1] = - nums[len - 1];
}
return Arrays.stream(nums).sum();
}
}
關(guān)于 nums = IntStream.of(nums).boxed().sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)).mapToInt(Integer::intValue).toArray();
這行代碼,讓我們一步一步解釋它的作用:
-
IntStream.of(nums)
:將原始的int
數(shù)組轉(zhuǎn)換為IntStream
,這是Java 8中的一個流。這是為了使我們能夠在流上進行后續(xù)操作。 -
.boxed()
:將IntStream
中的每個元素裝箱為Integer
對象。這是因為后續(xù)的排序操作需要使用比較器,而比較器需要處理對象。 -
.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
:對流中的元素進行排序。這里使用了一個比較器,該比較器會按照元素的絕對值從大到小進行排序。-
(o1, o2) -> Math.abs(o2) - Math.abs(o1)
是一個Lambda表達式,它描述了如何比較兩個元素o1
和o2
。 -
Math.abs(o2) - Math.abs(o1)
計算的是兩個元素絕對值的差值,這用于指示排序順序。
-
-
.mapToInt(Integer::intValue)
:將排序后的Integer
對象流轉(zhuǎn)換回IntStream
。 -
.toArray()
:將排序后的IntStream
轉(zhuǎn)換回int
數(shù)組。文章來源:http://www.zghlxwxcb.cn/news/detail-679413.html
這行代碼的最終作用是:將原始的 int
數(shù)組按絕對值從大到小排序后,以 int
數(shù)組的形式返回。這個排序后的數(shù)組將在后續(xù)的處理中被使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-679413.html
到了這里,關(guān)于K 次取反后最大化的數(shù)組和【貪心算法】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!