思路:
使總和最大,最大應該是再需要操作的次數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...