Leetcode1005K 次取反後最大化的陣列和

2021-10-02 23:14:33 字數 1263 閱讀 7714

思路:

使總和最大,最大應該是再需要操作的次數k條件下:負數變為正數符號不變。負數數目n_neg ,正數數目n_pos。

負數提取形成乙個序列s1 正數乙個序列 正數序列求和s2

k<=a:負數從小到大排序,(排在前面絕對值反而大)

s1 = 前k個絕對值求和+[k+1:最後]直接求和

k>a:負數序列取絕對值求和s1,

k-a奇數:取出序列中最小的正數min_pos,s2 = s2 -min_pos*2(主注意這裡是2倍的,最小的正數變成負數,相當於減了兩次)

k-a偶數:s2不變

s = s1+s2

本以為提交成功結果出錯

[-8,3,-5,-3,-5,-2]

6**錯誤原因:**當k-a為奇數時候,不是取正數序列中的最小值反轉,而是全部序列絕對值最小的數,因為此時負數序列都變成正數了啊!!!!!蒼天啊!!!

總結思路:

如果陣列全是正數,只需要反覆反轉最小的數,分兩種情況:

k 為奇數,等同於反轉 1 次

k 為偶數,等同於反轉 0 次

如果陣列有一部分負數,也分兩種情況:

當負數個數 < 反轉個數,把全部負數反轉後,就成了上面全是正數的情況

當負數個數 > 反轉個數,只需要盡力反轉最小的負數即可得到最大值

python**如下:

class solution(object):

def largestsumafterknegations(self, a, k):

""":type a: list[int]

:type k: int

:rtype: int

"""neg =

pos =

for i in range(len(a)):

if a[i]<0:

else:

s1 = abs(sum(neg))

s2 = sum(pos)

if k <= len(neg):

neg.sort()

s1 = abs(sum(neg[:k]))+sum(neg)-sum(neg[:k])

elif (k-len(neg))%2 == 1:

a =sorted(a,key=abs)

s2 = s2-abs(a[0])*2

s = s1+s2

return s

Leetcode 最小K個數

思路 基於快排改進 選取arr 0 作為基準值,tmp arr 0 排序後,返回tmp的下標index 此時,arr index 左側的值都小於tmp,右側的值都大於tmp。如果k index,那麼從起始點0到下標index 1的值就為最小的k個數,如果k index,說明k個數在區間 0,inde...

Leetcode 移掉k位數字

給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 示例 1 輸入 num 1432219 k 3 輸出 1219 解釋 移除掉三個數字 4,3,和 2 形成乙個新的最小的數字 1219。示例 2 輸入 num 10200 k 1 輸出 200 解釋 移掉首位...

LeetCode 第k個排列

給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 示例 1 輸入 n 3,k 3輸出 213 示例 2 輸入 n 4,k 9輸出 23...